用于查询的Mongoose Populate方法

时间:2015-09-22 01:07:40

标签: node.js mongodb mongoose mongodb-query

我有两个集合,其中一个集合包含一个链接字段,用于在两个集合之间建立关系。我试图弄清楚如何使用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" }

1 个答案:

答案 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;
                });
         }
    })

让我知道它是否适合你。