【问题标题】:Mongoose, check if value exists in an array of objectsMongoose,检查值是否存在于对象数组中
【发布时间】:2020-08-24 15:48:57
【问题描述】:

我有一个集合:我想使用 $in 运营商

Person = {
 name: String,
 members: [ {id: String, email: String}... {}]
}

到目前为止我一直在使用它:

Person.find({members: {"$in": [id1]}}) 

但我已经知道缺陷:如果成员数组类似于Members: [id1, id2, ... id3],则该方法将起作用。但它是一个对象数组。那么我该如何解决呢?

【问题讨论】:

    标签: javascript arrays node.js mongodb


    【解决方案1】:

    $elemMatch可以和Arrays of Embedded Documents一起使用:

    你可以试试:

    Person.find({ 
       members: { 
          $elemMatch: { id: id1 } 
       }
    }); 
    

    但是既然是Single Query Condition:

    Person.find({ 
       "members.id": id1
    }); 
    

    会成功的。

    【讨论】:

    • 最佳答案 imo。
    【解决方案2】:

    您可以通过以下方式使用elem match:

    db.collection.find({
      arrayfield: {
        $elemMatch: {
          id: ObjectId("5eaaeedd00101108e1123461")
        }
      }
    })
    

    同样可以通过以下方式在猫鼬中完成:

    query.elemMatch('arrayfield', { id: ObjectId("5eaaeedd00101108e1123461") })
    

    .

    query.where('arrayfield').elemMatch({ id: ObjectId("5eaaeedd00101108e1123461") })
    

    .

    query.elemMatch('arrayfield', function (elem) {
      elem.where('id').equals(ObjectId("5eaaeedd00101108e1123461"));
    })
    

    .

    query.where('arrayfield').elemMatch(function (elem) {
      elem.where({ id: ObjectId("5eaaeedd00101108e1123461") });
    })
    

    我已经使用了这个示例集合:

    [
      {
        "_id": ObjectId("5eaaeedd00101108e1123451"),
        "arrayfield": [
          {
            id: ObjectId("5eaaeedd00101108e1123461"),
            name: "David"
          },
          {
            id: ObjectId("5eaaeedd00101108e1123462"),
            name: "Brown"
          }
        ]
      },
      {
        "_id": ObjectId("5eaaeedd00101108e1123452"),
        "arrayfield": [
          {
            id: ObjectId("5eaaeedd00101108e1123471"),
            name: "Maple"
          },
          {
            id: ObjectId("5eaaeedd00101108e1123472"),
            name: "Green"
          }
        ]
      },
      {
        "_id": ObjectId("5eaaeedd00101108e1123453"),
        "arrayfield": [
          {
            id: ObjectId("5eaaeedd00101108e1123461"),
            name: "David"
          },
          {
            id: ObjectId("5eaaeedd00101108e1123482"),
            name: "Lacey"
          }
        ]
      }
    ]
    

    想现场体验吗?使用此链接在 mongo 操场上尝试 https://mongoplayground.net/p/H3fdmp9HkQv

    【讨论】:

      【解决方案3】:

      您可以在查询中使用members.id 作为字段来匹配您的子文档ids:

      Person.find({ "members.id": { "$in": ["id1"] } })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-13
        • 2017-03-22
        • 2020-11-30
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多