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

时间:2014-04-24 17:24:47

标签: node.js mongodb mongoose mongodb-query

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

{
 "_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")
            ]
        },...

我想做的是创建一个查询,该查询返回userId数组中特定userId数组中具有特定steps的所有课程,用于特定userId数组}。我尝试过像这样使用$elemMatch

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

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

2 个答案:

答案 0 :(得分:1)

我认为这对你有用,你有一点语法加上你需要使用ObjectId():

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

答案 1 :(得分:1)

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

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

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

返回查看$elemMatch文档。在这种情况下,您只需要直接的“点符号”形式