填充后的猫鼬$ match / filter

因此,我遇到了需要根据.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,}
  endDate: {
    type: Date,}
  hotelId: {
    type: ObjectId,}
});

因此,在这种情况下,我想对没有预订的酒店进行查询(实际上是想了解空房情况,但在示例中将其简化了)。为此,我可以加入预订(根据日期进行过滤),然后检查是否存在任何预订。

我设法用$lookup来做到这一点,

Hotel.aggregate([
  { $lookup: { from: 'bookings',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进行完整扫描。

prince373 回答:填充后的猫鼬$ match / filter

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3100295.html

大家都在问