12

我在这样的集合中有一个文档,我需要找到具有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"]
    }]
}]
4

2 回答 2

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"]}]}]}
于 2013-02-26T15:18:54.863 回答
6

由于您的功能键是一个数组,为了使用 $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}}])
于 2013-02-26T05:54:17.297 回答