这是两个集合的架构
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
。我能怎么做?我在互联网上找到了一些解决方案,但仍然不知道是否使用填充或聚合$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
数据类型。 ObjectId documentation
如果您想使用pupoluate
,则必须对其他架构使用ref
。
Population documentation
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
}
});
关于node.js - MongoDB 使用聚合 $lookup 或 Node.js 中的 populate 连接两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39201310/