gpt4 book ai didi

mongodb - 如何强制 MongoDB pullAll 忽略文档顺序

转载 作者:可可西里 更新时间:2023-11-01 09:30:14 29 4
gpt4 key购买 nike

我有一个具有以下结构的 mongoDB 文档:

{
user:user_name,
streams:[
{user:user_a, name:name_a},
{user:user_b, name:name_b},
{user:user_c, name:name_c}
]
}

我想使用 $pullAll 从流数组中移除,将流数组传递给它(数组的大小从 1 到 N 不等):

var streamsA = [{user:"user_a", name:"name_a"},{user:"user_b", name:"name_b"}]
var streamsB = [{name:"name_a", user:"user_a"},{name:"name_b", user:"user_b"}]

我使用以下 mongoDB 命令来执行更新操作:

db.streams.update({name:"user_name", {"$pullAll:{streams:streamsA}})
db.streams.update({name:"user_name", {"$pullAll:{streams:streamsB}})

移除 streamsA 成功,而移除 streamsB 失败。在翻阅 mongoDB 手册后,我发现 streamsA 和 streamsB 记录中的字段顺序必须与数据库中字段的顺序相匹配。对于 streamsB,顺序不匹配,这就是它没有被删除的原因。

我可以在执行更新操作之前将流重新排序为数据库文档顺序,但是有没有更简单、更清晰的方法来做到这一点?是否有一些标志可以设置为更新和/或 pullAll 以忽略订单?

谢谢你,加里

最佳答案

$pullAll运算符实际上是一种“特殊情况”,主要用于单个“标量”数组元素,而不是您使用它的方式的子文档。

改为使用 $pull它将检查每个元素并使用 $or文档列表的条件:

db.streams.update(
{ "user": "user_name" },
{ "$pull": { "streams": { "$or": streamsB } }}
)

这样一来,字段的顺序或查找当前 $pullAll 操作实际执行的“完全匹配”都没有关系。

关于mongodb - 如何强制 MongoDB pullAll 忽略文档顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776617/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com