67

モデル内の二重参照など、単純なクエリです。

スキーマ/モデル

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'])

実際には、populate の 1 つだけが機能します。

では、2 つの populate を機能させるにはどうすればよいでしょうか。

4

11 に答える 11

86

あなたはすでに次の正しい構文を使用しています:

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

注文のmealObjectId がMealsコレクションに含まれていない可能性がありますか?

于 2012-10-10T15:15:37.360 に答える
38

更新:このソリューションは、Mongoose http://mongoosejs.com/docs/3.8.x/docs/populate.html
のバージョン 3.x 用に残されていますが、Mongoose の >= 4.x バージョンについては文書化されていないため、答えはfrom @JohnnyHK は今のところ唯一有効なものです。

元の投稿
Mongoose >= 3.6 を使用している場合は、スペースで区切られたパス名の文字列を渡すことができます。

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

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

于 2015-09-09T07:49:04.240 に答える
16

これはおそらくすでに解決されていますが、これはMongodb > 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
    }
});

これを行うにはおそらく他の方法がありますが、これにより、初心者 (私のような) にとって非常に読みやすいコードが作成されます。

于 2018-05-11T23:44:23.873 に答える