多个填充物 - mongoosejs

时间:2012-10-10 14:18:30

标签: javascript node.js mongodb mongoose

只是一个简单的查询,例如在模型中使用双引号。

架构/模型

var OrderSchema = new Schema({

    user: {
        type    : Schema.Types.ObjectId,
        ref     : 'User',
        required: true
    },

    meal: {
        type    : Schema.Types.ObjectId,
        ref     : 'Meal',
        required: true
    },
});

var OrderModel = db.model('Order', OrderSchema);

查询

OrderModel.find()
    .populate('user') // works
    .populate('meal') // dont works
    .exec(function (err, results) {
         // callback
    });

我已经尝试了类似

的内容
.populate('user meal')
.populate(['user', 'meal'])

事实上,只有一个填充物可以使用。

那么,如何让两个填充工作?

8 个答案:

答案 0 :(得分:35)

您已经使用了正确的语法:

OrderModel.find()
    .populate('user')
    .populate('meal')
    .exec(function (err, results) {
         // callback
    });

订单中的meal ObjectId可能不在Meals集合中吗?

答案 1 :(得分:24)

更新:
此解决方案仍然适用于Mongoose的版本3.x http://mongoosejs.com/docs/3.8.x/docs/populate.html,但不再记录> = 4.x版本的Mongoose,因此来自@JohnnyHK的答案是唯一有效的一个现在开始。

原始邮寄
如果你使用的是Mongoose> = 3.6,你可以传递空格分隔的路径名字符串来填充:

OrderModel.find()
    .populate('user meal')
    .exec(function (err, results) {
         // callback
    });

http://mongoosejs.com/docs/populate.html

答案 2 :(得分:5)

这可能已经解决了,但这是我对多重& 3.6:

OrderModel.find().populate([{
    path: 'user',
    model: 'User'
}, {
    path: 'meal',
    model: 'Meal'
}]).exec(function(err, order) {
    if(err) throw err;
    if(order) {
        // execute on order
        console.log(order.user.username); // prints user's username
        console.log(order.meal.value);    // you get the idea
    }
});

可能有其他方法可以做到这一点,但这为初学者(像我一样)提供了非常易读的代码

答案 3 :(得分:4)

最新的猫鼬v5.9.15 有能力采取填充字段数组 这样就可以了,

.populate([ 'field1', 'field2' ])

答案 4 :(得分:3)

我认为最好的解决方案是在同一级别上填充多个外部字段时使用数组。我的代码显示,我有多个针对不同级别的填充。

const patients = await Patient.find({})
                    .populate([{
                        path: 'files',
                        populate: {
                            path: 'authorizations',
                            model: 'Authorization'
                        },
                        populate: {
                            path: 'claims',
                            model: 'Claim',
                            options: {
                                sort: { startDate: 1 }
                            }
                        }
                    }, {
                        path: 'policies',
                        model: 'Policy',
                        populate: {
                            path: 'vobs',
                            populate: [{
                                path: 'benefits'
                            }, {
                                path: 'eligibility', 
                                model: 'Eligibility'
                            }]
                        }
                    }]);

如您所见,无论何时需要填充文档的多个字段,我都会将填充键封装在一个数组中,并提供对象数组,每个对象都有不同的路径。我认为,这是最可靠,最简洁的方法。

答案 5 :(得分:2)

您可以尝试:

OrderModel.find()
    .populate('user')
    .populate('meal')
    .exec(function (err, results) {
         // callback
    });

或带有数组选项

OrderModel.find()
    .populate([
      {
        path: "path1",
        select: "field",
        model: Model1
      },
      {
        path: "path2",
        select: "field2",
        model: Model2
      }
    ])
    .exec(function (err, results) {
         // callback
    });

答案 6 :(得分:0)

我有同样的问题,但是我的错误不在填充中,我在模型中有错误

如果您这样做

未更正

user: {
 type: [Schema.Types.ObjectId],
 ref: 'User'
} 

正确

user: [{
 type: Schema.Types.ObjectId,
 ref: 'User'
}]

您必须在这样的对象周围放置数组

答案 7 :(得分:0)

要在控制器/动作功能中用对象数组填充多个字段,则已在post模式中引用了两者的模型

post.find({}).populate('user').populate('comments').exec(function (err,posts)
    {
    
    if(err)
    {
        console.log("error in post");
    }
    
        return  res.render('home',{
            h1:"home Page",
            posts:posts,
            
            });      
        });