从数组mongoDB获取匹配结果

时间:2019-03-16 17:24:07

标签: mongodb mongodb-query aggregation-framework

请帮我解决这个问题。

我有一个文件:

示例:

{
  "id":1,
  "rules": [
    {
      "trigger": {
        "criteria": [
          {
            "type": "A"
          }
        ]
      },
      "benefit": "iphone"
    },
    {
      "trigger": {
        "criteria": [
          {
            "type": "A"
          }
        ]
      },
      "benefit": "ipad"
    },
    {
      "trigger": {
        "criteria": [
          {
            "type": "B"
          }
        ]
      },
      "benefit": "ipad"
    }
  ]
}

我的预期结果是从本文档中受益于iphone和ipad。

[
  {
    "benefit": "iphone"
  },
  {
    "benefit": "ipad"
  }
]

所以我尝试了以下查询:

db.collection.find({"id":"1"},{"rules":{"$elemMatch":{"trigger.criteria.type":"A"}}}})

我知道$ elementMatch只会返回第一个匹配项,因此更改为汇总引用此LINK

db.collection.aggregate([
    {$match: {'id': '1'}},
    {$project: {
        rules: {$filter: {
            input: '$rules',
            as: 'rule',
            cond: {$eq: ['$$rule.trigger.criteria.type', 'A']}
        }},
        _id: 0
    }}
])

我刚收到这个。

{ "_id" : ObjectId("1"), "rules" : [ ] }

请对此查询进行更正。 非常感谢

1 个答案:

答案 0 :(得分:2)

您可以先使用$unwind管道,再使用$match。最后使用$project仅投影所需的字段。

db.collection.aggregate([
    {$match: {'_id': '1'}},
   {
       $unwind: "$rules"
   },
    {
       $unwind: "$rules.trigger.criteria"
   },
   {
       $match: {"rules.trigger.criteria.type":"A"}
   },
   {
       $project: 
       {
          "benefit": "$rules.benefit",
           _id:0
       }
   }

])