如何编写Mongo查询以查找具有条件的子文档

时间:2013-02-26 04:40:22

标签: mongodb

我在这样的集合中有一个文档,我需要找到带有form_Id:1和Function_Id:2的记录,如何编写mongo查询。

"Form_Id" : 1,
"Function" : [{
  "Function_Id" : 1,
  "Role" : [{
      "Role_Id" : 1,
      "UserId" : ["Admin", "001"]
    }]
}, {
  "Function_Id" : 2,
  "Role" : [{
      "Role_Id" : 2,
      "UserId" : ["Admin", "005"]
    }]
}]

2 个答案:

答案 0 :(得分:24)

您可以使用点表示法和$位置投影运算符来执行此操作:

db.test.find({Form_Id: 1, 'Function.Function_Id': 2}, {_id: 0, 'Function.$': 1})

返回:

{"Function": [{"Function_Id": 2, "Role": [{"Role_Id": 2, "UserId": ["Admin", "005"]}]}]}

答案 1 :(得分:5)

由于您的功能键是一个数组,为了使用$ match运算符,首先必须使用$ unwind运算符。 http://docs.mongodb.org/manual/reference/aggregation/unwind/ 然后使用$ match运算符查找您想要的文档http://docs.mongodb.org/manual/reference/aggregation/match/

所以你的查询应该是这样的

    db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}}])

默认情况下,mongo将显示文档的_id。因此,如果您不想显示_id,在匹配相关的后,您可以使用$ project运算符http://docs.mongodb.org/manual/reference/aggregation/project/

     db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Form_id":1,"Function":1}}])

如果您不希望显示form_id,则只需在查询的项目部分中不指定form_id。默认情况下,mongo只显示值为1的键。如果未提及该键,则不会显示该键。

    db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Function":1}}])