mongooseJS 在数组中查找带有 ID 的文档

jpm*_*yob 1 mongoose

我需要拉回 ID 存储在 ObjectIds 数组中的文档,所以我有一个“id”(123),我想要所有“租户”的数组元素为(123)的文档

数据看起来像这样

{
  "_id": ObjectId("abc"),
  "name": "Miroslav",
  "tenants": [
    ObjectId("123"),
    ObjectId("456")
  ]
}

{
  "_id": ObjectId("abd"),
  "name": "Lothar",
  "tenants": [
    ObjectId("123"),
    ObjectId("694")
  ]
}
Run Code Online (Sandbox Code Playgroud)

当然是 mongoDB 系统税

things.find( { 'tenants': ObjectId(123) } )
Run Code Online (Sandbox Code Playgroud)

工作得很好。

猫鼬抱怨

ReferenceError: ObjectId is not defined
Run Code Online (Sandbox Code Playgroud)

所以我试过这个

things.find( { 'tenants': mongoose.Schema.ObjectId(123) } )
Run Code Online (Sandbox Code Playgroud)

在集市上,猫鼬返回了除预期的 2 之外的所有记录。

我在 3 年前看到过这个问题,那个帖子没有答案,希望这里有人能有解决方案。

我使用“猫鼬”:“4.9.8”(由于特定的“承诺”问题,目前我无法升级版本)

谢谢

小智 6

要转换为 ObjectId,您需要使用:

things.find({tennants: mongoose.Types.ObjectId("123")});
Run Code Online (Sandbox Code Playgroud)

mongoose.Schema.ObjectId 和 mongoose.Types.ObjectId 的区别在于后者是 ObjectId 构造函数。它甚至可以像这样使用:

var id = new mongoose.Types.ObjectId("123");
Run Code Online (Sandbox Code Playgroud)

创建一个 objectId 并将其存储在 id 变量中。

而 mongoose.Schema.ObjectId(或 mongoose.Schema.Types.ObjectId)指的是一种数据类型。这就是您在架构中使用的内容。与您可能设置的方式相同

name: String
Run Code Online (Sandbox Code Playgroud)

在架构中,您使用 mongoose.Schema.Types.ObjectId 来指定数据类型是 mongoose ObjectId。

注意:我记得几个月前在文档中读过这个,但我现在找不到文档了,我认为我的解释是相当充分的