node.js - MongoDB 使用聚合 $lookup 或 Node.js 中的 populate 连接两个集合

标签 node.js mongodb mongodb-query aggregation-framework mongodb-aggregation

这是两个集合的架构

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,则必须对其他架构使用refPopulation 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/

相关文章:

javascript - Node.js 错误静默失败

javascript - 使用node-postgres执行查询时,aws lambda不返回任何内容

javascript - JavaScript 中的变量名拼写检查

mongodb - 在 Mongoose 中复制数据库

mongodb - mgo 有序排序聚合

mongodb - 如何取消设置除一组已知字段之外的所有字段?

html - 将 mysql 数据库打印到 socket.io 和 node.js 中的 html 页面

mongodb - 无法在 MongoDB 中映射文件内存

javascript - 查询比较对象数组

javascript - MongoDB - 相当于 LEFT JOIN,其中一个集合不存在