填充后的猫鼬$ match / filter

时间:2019-11-14 17:55:31

标签: node.js mongodb mongoose

因此,我遇到了需要根据.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进行完整扫描。

0 个答案:

没有答案