【问题标题】:Querying a property that is in a deeply nested array查询深度嵌套数组中的属性
【发布时间】:2014-06-10 03:23:10
【问题描述】:

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

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

但它似乎返回了一个空文档。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

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

    既然这是我们所说的ObjectId,那么它将是独一无二的,至少在这个数组中是这样。所以只需使用“点符号”形式:

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

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

    【讨论】:

      【解决方案2】:

      我认为这对你有用,你的语法有点不对,而且你需要使用 ObjectId():

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

      【讨论】:

      • 这行得通,但您可以将其简化为 Course.find({'steps.userId': '53554b56e3a1e1dc17db903f'}),因为您没有比较每个元素的多个字段。
      猜你喜欢
      • 2020-12-10
      • 2020-02-21
      • 2018-01-03
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多