请帮我解决这个问题。
我有一个文件:
示例:
{
"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" : [ ] }
请对此查询进行更正。 非常感谢
答案 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
}
}
])