MongoDB使用聚合$查找join两个集合,或者在Node.js中填充

这里有两个集合的架构

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 。 我能怎么做? 我在网上find了一些解决scheme,但是仍然不知道是使用填充还是聚合$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 ); } }) 

activity_id应该是ObjectId数据types。 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 } });