mongoose MongoDB根据字段值查找各种集合

vlf7wbxs  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(273)

假设数据库中有这样的文档:

{
   name: 'my list',
   items: [
      { type: 'book', id: 5364 },
      { type: 'car', id: 354 },
      { type: 'laptop', id: 228 }
   ]
}

我需要根据type值,从每个项目自己的集合中获取其数据。
我找了一下,但找不到正确的方法。
预期输出:

{
   name: 'my list',
   items: [
      { type: 'book', id: 5364, data: [{...}] },
      { type: 'car', id: 354, data: [{...}] },
      { type: 'laptop', id: 228, data: [{...}] }
   ]
}

第一个集合的Mongoose模式(如上):

{
   name: String,
   items: {
      type: Array,
      default: []
   }
}

而必须查找的其他集合具有相应的_id字段。

06odsfpq

06odsfpq1#

有几种不同的方法可以做到这一点。为了与您目前拥有的最相似,您只需要做一个小的修改。type是Mongoose中的一个关键字,所以如果您想在您的模式中有一个实际上称为“type”的字段,您需要使用这个词两次。一次是Mongoose关键字,另一次是定义您的模式。

{
 name: String,
 items: [{
   type: { type: String},
   id: Number,
   data: []
  }]
}

如果data字段来自另一个集合,则可以使用引用,然后在find方法上调用populate()

// ItemSchema
{
 name: String,
 items: [{
  type: { type: String },
  id: Number,
  data: [{
   type: Schema.Types.ObjectId,
   ref: 'OtherSchemaName' 
  }]
 }]
}

// Find Method with populate
const myList = await ItemSchema.find({type: "book"}).populate('data')

// Result
{
 name: 'my list',
 items: [
   { type: 'book', id: 5364, data: [{...}] },
 ]
}

相关问题