在猫鼬中,如何根据相关集合中的值查找记录?

Posted

技术标签:

【中文标题】在猫鼬中,如何根据相关集合中的值查找记录?【英文标题】:In mongoose, how to find records based on value in related collection? 【发布时间】:2020-01-24 18:00:25 【问题描述】:

在 Mongoose 中,我有两个集合,一个引用另一个。是否有可能有一个查找查询,它根据另一个值选择记录。我试图得到的一个例子(不是实际的模式):

const CarModelSchema = new mongoose.Schema(
   name: String,
   brand:  type: mongoose.Schema.Types.ObjectId, ref: 'CarBrand' 
);

const CarBrandSchema = new mongoose.Schema(
   name: String,
   country: String
);

然后我想执行表单的查询,而不需要执行两个查询:

CarModelSchema.find( 'brand.country': 'GER' );

到目前为止,我还无法完成这项工作,所以我想知道这是否可以在 Mongo 中完成,或者我是否处理错了?

【问题讨论】:

如果你想合并数据使用$aggregation 【参考方案1】:

是的,这是可能的。

我知道您的架构没有模型,所以像这样添加它们:

const CarModel = mongoose.model('CarModel', CarModelSchema);
const CarBrand = mongoose.model('CarBrand', CarBrandSchema);

品牌也应该这样定义:

brand: [ type: mongoose.Schema.Types.ObjectId, ref: 'CarBrand' ] //added the brackets

然后,您可以通过执行以下操作来运行查找查询以按国家/地区进行过滤:

CarModel.
  find(...).
  populate(
    path: 'brand',
    match:  country:  $eq: 'GER' ,
    // You can even select the field you want using select like below, 
    select: 'name -_id',
    //Even limit the amount of documents returned in the array
    options:  limit: 5 
  ).
  exec();

只要 CarModel 集合中的 brands 数组中保存的 ObjectId 有效或存在,就应该这样做。

【讨论】:

这仍然找到所有符合find()中过滤器的汽车! brand 字段也不是数组。 他的架构不正确。 brand: type: mongoose.Schema.Types.ObjectId, ref: 'CarBrand' 应该是 brand: [ type: mongoose.Schema.Types.ObjectId, ref: 'CarBrand' ]。请注意,我添加了括号 @CuongLeNgoc 。我会更新我的答案以反映变化 但是brand: type: mongoose.Schema.Types.ObjectId, ref: 'CarBrand' 是正确的语法。为什么要改? 如果您需要一个数组,请首先查看文档mongoosejs.com/docs/populate.html。您需要将所有 _id 存储在一个数组中,以便在填充 @CuongLeNgoc 上检索相关文档【参考方案2】:

在您的人口中使用 match 即可。

CarModel.find()
  .populate(
     path: 'brand',
     model: CarBrandModel,
     match:  country:  $eq: 'GER' ,
  )
  .exec()

请记住,您必须像这样定义 CarModelCarBrandModel

const CarModel = mongoose.model('CarModel', CarModelSchema)
const CarBrandModel = mongoose.model('CarBrandModel', CarBrandSchema)

【讨论】:

【参考方案3】:

是的,你做错了。

CarModelSchema.brand 中没有保存字符串,保存了 ObjectId,因此你必须找到那个 ObjectId(引用)。

您可以手动执行此操作 - 首先找到 CarBrandSchema.find( 'country': 'GER' );,然后使用其 ObjectId (=_id),或者您可以使用 https://mongoosejs.com/docs/populate.html 使用 CarBrand 对象填充您的 CarModel。

【讨论】:

以上是关于在猫鼬中,如何根据相关集合中的值查找记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过填充字段在猫鼬中查找文档?

在猫鼬中按索引查找一个

在猫鼬中查找 ID 数组

如何在猫鼬中填充模型

如何在猫鼬中查询多个集合

如何在猫鼬中找到随机记录[重复]