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

Mongodb 如何编写Mongo查询以查找具有条件的子文档,mongodb,Mongodb,我在这样的集合中有一个文档,我需要找到带有表单\u Id:1和函数\u Id:2的记录,如何编写mongo查询 "Form_Id" : 1, "Function" : [{ "Function_Id" : 1, "Role" : [{ "Role_Id" : 1, "UserId" : ["Admin", "001"] }] }, { "Function_Id" : 2, "Role" : [{ "Role_Id" : 2,

我在这样的集合中有一个文档,我需要找到带有表单\u Id:1和函数\u 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"]
    }]
}]

由于函数键是数组,为了使用$match运算符,首先必须使用$unwind运算符。 然后使用$match操作符查找所需的文档

所以您的查询应该如下所示

    db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}}])
默认情况下,mongo将显示文档的_id。因此,如果您不想显示_id,在匹配相关id之后,可以使用$project操作符

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

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

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

db.test.find({Form\u Id:1,'Function.Function\u Id':2},{u Id:0,'Function.$':1})
返回:

{“函数”:[{“函数Id”:2,“角色”:[{“角色Id”:2,“用户Id”:[“管理员”,“005”]}]}

是否有可能获得这样的记录
{“Function\u Id”:2,“Role”:[{“Role\u Id”:2,“UserId”:[“Admin”,“005”]}
作为我的结果。我在我的数据库中尝试了你的答案,获取类型错误聚合不是一个函数外壳。你有哪个版本的mongo,因为我在发布答案之前已经尝试了所有的查询,并且它可以工作。从mongo 2.1开始支持聚合。我使用的是mongodb版本win32-i386-2.0.7,那么功能是什么呢g在这个版本中无法实现,在这个版本中有什么方法可以做到这一点。我在最新版本MongoDB 2.2.3中尝试了你的代码,结果是
{“result”:[],“ok”:1}
。我是否必须对我的文档进行任何更改。请指导我。在我的回复中,我发布了
表单id
,而不是
表单id
。我认为这就是问题所在。您是否给出了正确的集合名称?如果仍然无效,您可以发布您的查询。@JhonnyHK我尝试了您的答案,结果如下
{“Function”:[{},{}]}
,我可以知道我在这方面做错了什么。@JhonnyHK我不知道我在哪里做错了,你的查询给出了确切的结果,我在c#application中尝试了同样的方法,如
var Logs=db.GetCollection(“Access\u Rights”).FindAs(query).SetFields(Fields.Exclude(“\u id”,Function.Role”).SetFields(Fields.Include)(“Function.$”)
我的做法是正确的。请指导我。
    db.collection.aggregate([{$unwind:"$Function"},{$match:{"Form_id":1,"Function.Function_id":2}},{$project:{"_id":0,"Function":1}}])