MongoDB查询解决方案

时间:2017-12-14 21:16:10

标签: express mongoose

针对此情况的优化查询是什么

所以情境是一个用户正在关注许多XY用户并且这些XY已经获得了事件,那么最佳和优化查询将以排序形式(按日期排序)从他的关注者XY中获取所有事件。我的架构中有创建日期

这是我的用户架构

var userSchema = new Schema({
    followers:[{
        type: Schema.Types.ObjectId,
        ref: 'XY'
    }]
});

var User = mongoose.model('User',userSchema);
module.exports = User;

这是我的XY架构

var XY= new Schema({

    events:[{
        type: Schema.Types.ObjectId,
        ref: 'Event'
    }],

});


var XY= mongoose.model('XY',XY);
module.exports = XY;

1 个答案:

答案 0 :(得分:0)

试试这个。

User.aggregate([
            { $match: { _id: mongoose.Types.ObjectId(<userId here>) } },
            { $unwind: { path: "$followers" } },
            { $lookup: { from: 'XY', localField: 'followers', foreignField: '_id', as: 'followers' } },
            { $unwind: { path: "$followers" } },
            { $unwind: { path: "$followers.events" } },
            { $lookup: { from: 'Event', localField: 'followers.events', foreignField: '_id', as: 'followers.events' } },
            { $unwind: { path: "$followers.events" } },
            { $sort: { "followers.events.createdDate": **-1** } }, // -1 -> desc, 1 -> asc
            {
                "$project":
                {
                    "_id": "$followers.events._id",
                    "createdDate": "$followers.events.createdDate",
                    // populate other event details here accordingly
                }
            }
           ], function (err, events, next) {
       });

$ lookup 允许您从其他架构填充子文档。  填充后,生成的文档将是一个数组,因此在处理它们之前会使用 $ unwind

请注意,在执行 $ lookup 之前也会使用 $ unwind ,因为我们尝试填充的字段本身就是一个数组。