2

2 つのコレクションのスキーマを次に示します。

var activitySchema = new Schema({

    activity_id: {type: String, index: {unique: true}, required: true}, 

    begin_date : String,
    ...
})

var registrationSchema = new Schema({

    activity_id: {type: String, index: {unique: true}, required: true}, 

    registration_id: {type:String, trim: true, index: true ,required: true },

    email       : String,
    ...
})

activity.begin_date , registration.id , registration.emailは同じクエリで欲しい。どのようにできるのか?インターネットでいくつかの解決策を見つけましたが、populate を使用するか、aggregation を使用するかはまだわかりません$lookup(これは新しいようです)。

これが私が試した方法ですが、まったく機能しません。

models.Registration.aggregate([

        {
            $lookup: {
                from: "Activity",
                localField: "activity_id",
                foreignField: "activity_id",
                as: "activity_docs"
            }
        },
        {"$unwind" : "activity_docs"},

    ], function( err , result ){
        if(result){
            fullDoc = result;
        }else{
            next( err );
        }
    })
4

1 に答える 1

2

activity_id はObjectIdデータ型である必要があります。ObjectId ドキュメント

を使用する場合は、他のスキーマ pupoluateに使用する必要があり ます。母集団のドキュメンテーションref

var activitySchema = new Schema({

    begin_date : String,
    ...
})
var Activity= mongoose.model('Activity', activitySchema );


var registrationSchema = new Schema({

    activity_id: {type: Schema.Types.ObjectId, ref : 'Activity', required: true}, 
    email       : String,
    ...
})



  var Registration = mongoose.model('Registration', registrationSchema);

したがって、次のようなクエリ:

var query = Registration.find({_id: 'registration_id parameter'});
query.select('_id activity_id email');
query.populate('activity_id','_id begin_date');
query.exec(function(error,result){
   if(error){
        /// handle error
   }else{
       // handle result
   }
});
于 2016-08-29T08:35:30.397 に答える