针对此情况的优化查询是什么
所以情境是一个用户正在关注许多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;
答案 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 ,因为我们尝试填充的字段本身就是一个数组。