在猫鼬中,如何根据相关集合中的值查找记录?
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()
请记住,您必须像这样定义 CarModel
和 CarBrandModel
:
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。
【讨论】:
以上是关于在猫鼬中,如何根据相关集合中的值查找记录?的主要内容,如果未能解决你的问题,请参考以下文章