$ setIntersection是否可以处理对象?

时间:2017-10-25 06:19:20

标签: mongodb aggregation-framework

我似乎无法使用$ setIntersection来处理对象。

示例:

对象1:

[
  {name: "test5", value:5},
  {name: "test4", value:4},
  {name: "test3", value:3},
  {name: "test2", value:2}
]

对象2:

[
  {name: "test5", value:5},
  {name: "test422", value:422},
  {name: "test333", value:3333},
  {name: "test211", value:211}
]

$ setIntersection会返回我[]而不是:

[
  {name: "test5', value:5}
]

如果$ setIntersection不能与Objects一起使用,有什么工作可以使用吗?

2 个答案:

答案 0 :(得分:1)

好像你做错了:

如果我插入一个像这样的数组的对象:

db.test.insert({
    "a" : [ 
        {
            "name" : "test5",
            "value" : 5.0
        }, 
        {
            "name" : "test4",
            "value" : 4.0
        }, 
        {
            "name" : "test3",
            "value" : 3.0
        }, 
        {
            "name" : "test2",
            "value" : 2.0
        }
    ]
})

我使用$setInsersection运行.aggregate(),并提供所提供的对象数组:

db.getCollection('test').aggregate([
  { "$project": {
    "a": {
      "$setIntersection": [
        "$a",
        [
          {name: "test5", value: 5},
          {name: "test422", value: 422},
          {name: "test333", value: 3333},
          {name: "test211", value: 211}
        ]
      ]    
    }  
  }}
])

然后我得到了预期的结果:

/* 1 */
{
    "_id" : ObjectId("59f02df75b9b8bb266a563cb"),
    "a" : [ 
        {
            "name" : "test5",
            "value" : 5.0
        }
    ]
}

如果属性“反转”,如:

db.getCollection('test').aggregate([
  { "$project": {
    "a": {
      "$setIntersection": [
        "$a",
        [
          { value: 5, name: "test5" },
          {name: "test422", value: 422},
          {name: "test333", value: 3333},
          {name: "test211", value: 211}
        ]
      ]    
    }  
  }}
])

然后结果数组为“空”,应该是预期的,因为{ "name": "test5", "value": 5 }{ "value": 5, "test": name }不同,就“集合”而言。

答案 1 :(得分:0)

您无法在此处比较两个不同文档中的数组。为此,这两个数组都需要在同一个文档中(或直接作为参数而不是字段名提供)。

$setIntersection将两个或更多数组作为输入。它不会比较不同文档中的对象,我认为这就是你正在做的事情。

以下命令对我来说很好:
插入:

db.mycol.insert({f1:[
  {name: "test5", value:5},
  {name: "test4", value:4},
  {name: "test3", value:3},
  {name: "test2", value:2}
],f2:[
  {name: "test5", value:5},
  {name: "test422", value:422},
  {name: "test333", value:3333},
  {name: "test211", value:211}
]})

<强>输出:
WriteResult({ "nInserted" : 1 })

汇总:

db.mycol.aggregate([{$project:{com:{$setIntersection:["$f1","$f2"]}}}])

输出

{ "_id" : ObjectId("59f02eba7f11fa2e1df15e53"), "com" : [ { "name" : "test5", "value" : 5 } ] }