我正在开发一个具有以下格式的集合:
{_id:"star",
menu:[
{
"cat_id":"123",
"cat_name":"Cars",
"items":[
{
"item_id":"i10",
},
{
"item_id":"i20"
}
]
},
{
"cat_id":"345",
"cat_name":"Trucks",
"items":[
{
},
{
}
]
},
{
"cat_id":"456",
"cat_name":"Buses",
"items":[
{
},
{
}
]
}
]
}
我正在尝试使用item_id获取项目:" i10"。 我执行了以下查询:
db.item_store.find({},
{ "_id" : "star",
"menu" : { "$elemMatch" : { "items" : { "$elemMatch" : {
"item_id" : "i10" } } } } })
此查询返回整个cat_id 123数组。输出:
{_id:"star",
menu:[
{
"cat_id":"123",
"cat_name":"Cars",
"items":[
{
"item_id":"i10",
},
{
"item_id":"i20"
}
]
}]
}
它应该只返回带有ID" i10"。
的项目即使这返回了相同的输出:
db.merchant_menu.find({ "_id" : "star", "menu" : { "$elemMatch" : { "items" : { "$elemMatch" : { "item_id" : "i10" } } } } },{'menu.items.$':1})
另外,如何修改上述查询以在查询条件中包含cat_id
?我知道cat_id
。
答案 0 :(得分:1)
您可以首先在聚合的早期对菜单数组执行 $unwind
操作,然后使用item_id
对项目数组进行匹配,从而使用聚合:< / p>
db.collection.aggregate([
{
$unwind: "$menu"
},
{
$match: {
"menu.items.item_id":"i20"
}
},
{
$unwind: "$menu.items"
},
{
$match: {
"menu.items.item_id":"i20"
}
}
])
导致:
{
"result" : [
{
"_id" : "star",
"menu" : {
"cat_id" : "123",
"cat_name" : "Cars",
"items" : {
"item_id" : "i20"
}
}
}
],
"ok" : 1.0000000000000000
}