因此,我遇到了需要根据.populate的结果过滤文档的问题。我不能简单地在match
选项的populate()
参数中执行此操作,因为我想从填充中检查结果数组的大小。
示例:
酒店型号:
var HotelSchema = new Schema({
name: {
type: String,
required: true,
}
});
HotelSchema.virtual('bookings', {
ref: 'Booking',
localField: '_id',
foreignField: 'hotelId',
justOne: false,
});
预订模式:
var BookingSchema = new Schema({
startDate: {
type: Date,
required: true,
}
endDate: {
type: Date,
required: true,
}
hotelId: {
type: ObjectId,
required: true,
}
});
因此,在这种情况下,我想对没有预订的酒店进行查询(实际上是想了解空房情况,但在示例中将其简化了)。为此,我可以加入预订(根据日期进行过滤),然后检查是否存在任何预订。
我设法用$lookup
来做到这一点,
Hotel.aggregate([
{ $lookup: { from: 'bookings', localField: '_id', foreignField: 'hotelId', as: 'bookings' } },
{ $match: { bookings: { $size: 0 }}}
]);
(作为附带说明,有一种方法只能查找预订的大小,而不是返回每个对象吗?我似乎无法弄清楚)
但是当我执行.populate
时,我似乎找不到任何可以添加此条件的地方。这样的事情是不好的:
Hotel.find({})
.populate({ path: 'bookings', match: { bookings: { $size: 0 } } })
我之所以要使用填充的原因是因为出现了如下所述的性能问题:https://github.com/Automattic/mongoose/issues/3683,并且在使用多个数据库的情况下,由于在这种情况下$ lookup不起作用
由于这种关系的布局,$ lookup的花费比填充的时间要长得多,因为对每个bookings
都将对Hotel
进行完整扫描。