【问题标题】:Mongoose Populate Method for Querying用于查询的 Mongoose 填充方法
【发布时间】:2015-09-23 10:47:59
【问题描述】:

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

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    我认为您已经优化了架构。当您想用图像集合填充描述时,为什么您在两个模式中都有相同的字段,如模式、颜色。如果要填充,则必须在定义图像模式时参考描述集合。

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

    让我知道它是否适合你。

    【讨论】:

    • 感谢您的回复。如果我想通过命令行更新我的图像,我将如何设置descriptions_id?对于这个例子,我在我的描述集合中将_id 设置为navy_blue,然后更新了我想要连接到该集合的所有图像,将附加字段descriptions_id 设置为navy_blue。这是设置它的正确方法吗?我编辑了答案以显示我的图像文档的示例
    猜你喜欢
    • 2013-07-06
    • 2021-03-03
    • 1970-01-01
    • 2016-07-11
    • 2019-11-12
    • 2016-06-18
    • 2012-07-03
    相关资源
    最近更新 更多