Mongoose,检查值是否存在于对象数组中

22

我有一个集合:我想使用$in运算符

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

到目前为止,我使用的是:

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

但我已经知道了缺陷:如果成员数组像成员:[id1,id2,... id3]这样,那么该方法将奏效。但它是一个对象数组。那么我该如何解决呢?

3个回答

39

$elemMatch 可以与嵌入式文档数组一起使用:

在您的情况下,您可以尝试:

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

但因为它是一个单个查询条件

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

能解决问题。


3
在我看来,这是最佳答案。 - r3wt

4
您可以在查询中使用members.id作为字段,以匹配您的子文档id
Person.find({ "members.id": { "$in": ["id1"] } })

4
您可以以下列方式使用元素匹配(elem match):
db.collection.find({
  arrayfield: {
    $elemMatch: {
      id: ObjectId("5eaaeedd00101108e1123461")
    }
  }
})

以下是用mongoose实现相同功能的方式:

以下为使用mongoose实现相同功能的方式:

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


我想匹配多个ID,例如5eaaeedd00101108e1123461、5eaaeedd00101108e1123482,以查找devid和lacey。 - teenage vampire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接