在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分钟运行一次,所以我希望在任何可能的地方都更有效率。