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