比较两个对象数组并检查它们是否具有公共元素

Ope*_*per 5 mongodb mongodb-query aggregation-framework

如何在MongoDB中执行返回_id的查询,如果FirstArray并且SecondArray在"名称"字段中有共同的元素?

这是集合结构:

{
    "_id" : ObjectId("58b8d9e3b2b4e07bff8feed5"),
    "FirstArray" : [ 
        {
            "Name" : "A",
            "Something" : "200 ",
        }, 
        {
               "Name" : "GF",
            "Something" : "100 ",
        } 
    ],
    "SecondArray" : [ 
        {
            "Name" : "BC",
            "Something" : "200 ",
        }, 
        {
               "Name" : "A",
            "Something" : "100 ",
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

use*_*814 10

3.6更新:

使用$match$expr.$expr允许在$matchstage中使用聚合表达式.

db.collection.aggregate([
  {"$match":{
    "$expr":{
      "$eq":[
        {"$size":{"$setIntersection":["$FirstArray.Name","$SecondArray.Name"]}},
        0
      ]
    }
  }},
  {"$project":{"_id":1}}
])
Run Code Online (Sandbox Code Playgroud)

旧版:

您可以尝试$redact使用$setIntersection您的查询.

$setIntersection比较FirstArray小号Names的SecondArray小号NameS和返回的通用名称的文件,然后排列$size$redact并比较结果与0保留和删除其他文件.

db.collection.aggregate(
  [{
    $redact: {
      $cond: {
        if: {
          $eq: [{
            $size: {
              $setIntersection: ["$FirstArray.Name", "$SecondArray.Name"]
            }
          }, 0]
        },
        then: "$$KEEP",
        else: "$$PRUNE"
      }
    }
  }, {
    $project: {
      _id: 1
    }
  }]
)
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的命! (2认同)