比较数组并返回差异

时间:2017-07-07 14:20:48

标签: mongodb mongodb-query aggregation-framework

我在运行时创建的内存中有一个数组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]

1 个答案:

答案 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作为输入“两次”提供,因此也会“两次”返回。