查询深度嵌套数组中的属性

所以我在课程集合中有这个文档

{ "_id" : ObjectId("53580ff62e868947708073a9"), "startDate" : ISODate("2014-04-23T19:08:32.401Z"), "scoreId" : ObjectId("531f28fd495c533e5eaeb00b"), "rewardId" : null, "type" : "certificationCourse", "description" : "This is a description", "name" : "testingAutoSteps1", "authorId" : ObjectId("532a121e518cf5402d5dc276"), "steps" : [ { "name" : "This is a step", "description" : "This is a description", "action" : "submitCategory", "value" : "532368bc2ab8b9182716f339", "statusId" : ObjectId("5357e26be86f746b68482c8a"), "_id" : ObjectId("53580ff62e868947708073ac"), "required" : true, "quantity" : 1, "userId" : [ ObjectId("53554b56e3a1e1dc17db903f") ] },... 

我想要做的是创build一个查询,返回在特定userIdsteps数组中的userId数组中具有特定userId所有课程。 我已经尝试使用$elemMatch像这样

 Course.find({ "steps": { "$elemMatch": { "userId": { "$elemMatch": "53554b56e3a1e1dc17db903f" } } } }, 

但它似乎正在返回一个空的文件。

除非您实际上在该嵌套数组元素中具有复合子文档,否则$elemMatch用法不是必需的。 除非被引用的值可能在另一个复合文件中复制,否则也是没有必要的。

由于这是一个ObjectId我们正在讨论,那么它将是唯一的,至less在这个数组中。 所以只需使用“点符号”的forms:

 Course.find({ "steps.userId": ObjectId("53554b56e3a1e1dc17db903f") }, 

回头看看$elemMatch文档。 在这种情况下,直接的“点符号”forms就是你所需要的

我认为这会对你有用,你的语法有点偏离,你需要使用ObjectId():

 db.Course.find({ steps : { $elemMatch: { userId:ObjectId("53554b56e3a1e1dc17db903f")} } })