我在运行时创建的内存中有一个数组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]
。
答案 0 :(得分:5)
“{修改”文档作为回应的唯一内容是.aggregate()
和.mapReduce()
,其中前者是更好的选择。
在这种情况下,你要求$setDifference
比较“套”并返回两者之间的“差异”。
因此用您的数组表示文档:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
运行聚合:
[2,3,4,4]
返回:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
如果您不想要“设置”,而是希望提供类似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" ]
}
}
}
}
}
}
}
}}
])
的数组,那么您可以与$filter
和$in
进行比较,如果您至少拥有MongoDB 3.4:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
或者在早期版本中使用$filter
和$anyElementTrue
:
4
两者都会返回:
lookup.py
这当然是“不是一套”,因为lookup
作为输入“两次”提供,因此也会“两次”返回。