gpt4 book ai didi

mongodb - 比较数组并返回差异

转载 作者:可可西里 更新时间:2023-11-01 09:57:39 24 4
gpt4 key购买 nike

我在内存中有一个数组 A 在运行时创建,另一个数组 B 保存在 mongo 数据库中。如何高效地从 A 中获取 B 中不存在的所有元素?

您可以假设存储在 mongodb 中的数组比在运行时创建的数组大几个数量级,因此我认为从 mongo 获取完整数组并计算结果效率不高,但我没有在 mongo 中找到任何允许我计算我想要的结果的查询操作。

请注意 $nin运算符与我想要的相反,即它从 B 中检索不在 A 中的元素。

例子:

在我的应用程序运行时创建的数组 A 是 [2, 3, 4]

存储在mongodb中的数组B是[1, 3, 5, 6, 7, 10]

我期望的结果是 [2, 4]

最佳答案

响应中唯一“修改”文档的是.aggregate().mapReduce() ,前者是更好的选择。

在这种情况下,您要求的是 $setDifference它比较“集合”并返回两者之间的“差异”。

所以用你的数组表示一个文档:

db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })

运行聚合:

db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])

哪个返回:

{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }

如果您不想要“集合”,而是想提供像[2,3,4,4] 这样的数组,那么您可以与$filter 进行比较。和 $in相反,如果您至少拥有 MongoDB 3.4:

db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])

或用$filter$anyElementTrue在早期版本中:

db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": {
"$anyElementTrue": {
"$map": {
"input": "$b",
"as": "b",
"in": {
"$eq": [ "$$a", "$$b" ]
}
}
}
}
}
}
}
}}
])

两者都会返回的地方:

{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }

这当然不是“集合”,因为 4 作为输入提供了“两次”,因此也返回了“两次”。

关于mongodb - 比较数组并返回差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973140/

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