Mongoose在嵌套模式中查找

时间:2017-03-29 19:30:34

标签: javascript node.js mongodb mongoose mongoose-schema

在mongoose中,我们深入搜索嵌套模式,但没有取得多大成功。每次运行此函数时,我们总是返回一个空数组。

function findAlarms(lastUpdate = new Date(0), record = Record) {

  // For docs on find http://mongoosejs.com/docs/queries.html
  return record
    .find({
      // Date due must be less than "now"
      'documents.alarm.date_due': {
        $lte: Date.now(),
      },
      // Must be greater than the last update and less than "now"
      'documents.alarm.date_reminder.reminder': {
        $gte: lastUpdate,
        $lte: Date.now(),
      },
    })
    .populate('documents')
    .exec();
}

我们的模式非常概括,如下所示:

const RecordSchema = new mongoose.Schema({
  documents: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Document',
    },
  ],
});

我们的文档架构,类似地总结如下:

const DocumentSchema = new mongoose.Schema({
  alarm: {
    date_due: { type: Date },
    date_reminder: [
      {
        reminder: { type: Date },
      },
    ],
  },
});

即使我们知道有匹配的文档,此搜索也不会返回匹配的元素。如果我们修改我们的findAlarms方法以使用文档架构:

function findAlarms(lastUpdate = new Date(0), document = Document) {
  // For docs on find http://mongoosejs.com/docs/queries.html
  return document
    .find({
      // Date due must be less than "now"
      'alarm.date_due': {
        $lte: Date.now(),
      },
      // Must be greater than the last update and less than "now"
      'alarm.date_reminder.reminder': {
        $gte: lastUpdate,
        $lte: Date.now(),
      },
    })
    .exec();
}

它将返回我们所有匹配的文件。但是,拥有记录对我们的需求至关重要。现在,我可以使用hack,然后使用返回的document._id数组查找记录。

尽管如此,我很想知道是否有一种方法我们可以直接使用这些记录,因为添加额外的步骤感觉非常hacky,这个操作每5分钟运行一次,所以我希望在任何可能的地方都更有效率。

0 个答案:

没有答案