我有两个集合,其中一个集合包含一个链接字段,用于在两个集合之间建立关系。我试图弄清楚如何使用populate
方法正确显示符合我的过滤条件的两个集合中的文档。
这是我的两个模型的设置。
图片
var imageSchema = new Schema({
pattern: { type: String, enum: ['Solid', 'Stripe', 'Plaid'] },
color: { type: String, enum: ['Grey', 'Navy Blue', 'Black', 'Khaki', 'Brown'] },
imageName: String,
imageUrl: String,
imageSource: String,
descriptions_id: String
});
var Images = mongoose.model('Images', imageSchema);
module.exports = Images;
描述
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var descriptionSchema = new Schema({
_id: String,
pattern: { type: String, enum: ['Solid', 'Stripe', 'Plaid'] },
color: { type: String, enum: ['Grey', 'Navy Blue', 'Black', 'Khaki', 'Brown'] },
body: String,
});
var Description = mongoose.model('Description', descriptionSchema);
module.exports = Description;
基本上我想显示与我的描述id值匹配的所有图像。例如,我的_id
值为navy-blue
的说明。此值与图像文档的descriptions_id
值相同。
这会是合适的命令吗?
Images.find({ pattern: "solid", color:"navy-blue", descriptions_id:"navy-blue"}).populate('images').populate('descriptions');
更新
图像和描述文档示例
说明:
{
"_id" : "navy-blue",
"body" : "Lorem Impsum."
}
图片:
{ "_id" : ObjectId("55f5c6db7f057f0dfdfasdff2cf1cd"), "pattern" : "stripe", "propercasePattern" : "Stripe", "color" : "navy-blue", "propercaseColor" : "Navy Blue", "imageUrl" : "https://s3.amazonaws.com/blue-shirt.jpg", "imageSource" : "source", "descriptions_id" : "navy-blue" }
答案 0 :(得分:0)
我认为您已经优化了架构。由于您想要使用图像集合填充描述,那么为什么在两个模式中都有相同的字段,如模式,颜色。如果要填充,则必须在定义图像模式时引用描述集合。
var imageSchema = new Schema({
imageName: String,
imageUrl: String,
imageSource: String,
descriptions_id:{ type: Schema.ObjectId,
ref: 'Description'}
});
然后尝试使用此查询
Images.find().populate({path:'descriptions_id',match: {pattern:'solid',color:'navy-blue'}).exec(function(res){
if(res){
res = res.filter(function (doc) {
return doc.descriptions_id;
});
}
})
让我知道它是否适合你。