元素匹配$ elemmatch返回所有嵌套字段

时间:2015-03-22 21:05:26

标签: mongodb

我正在开发一个具有以下格式的集合:

{_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

1 个答案:

答案 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
}