文档结构(与此问题无关的字段已删除):
{
_id: ObjectId,
lastDate: Date,
interval: Integer, // in seconds
mode: String
}
我正在寻找的是类似于以下的查询:
{
lastDate: {
$lt: new Date() - $interval
},
mode: {
$in: ['collect', 'debug']
}
}
因此,查询将获得lastDate
的所有文档小于当前日期/时间减去其自己的间隔。也只能获取模式设置为collect或debug的文档。
这可以通过基本查询完成,还是需要使用aggregate或mapReduce?
答案 0 :(得分:1)
数学上,你的情况是
lastDate < current_time - interval
相当于
lastDate + interval < current_time
因此,代替(或除了)存储lastDate
和interval
,存储它们的总和。总和可以存储为纪元以来的秒数或日期 - 您可以在客户端代码中选择最方便的内容。
答案 1 :(得分:0)
我找到了一个解决方案,但我不确定它是否是表现最佳的解决方案。
有效的查询:
{
$where: "this.lastDate < new Date() - this.interval",
mode: {
$in: ['collect', 'debug']
}
}
使用
在JavaScript表达式或函数中引用该文档$where
运算符将包含JavaScript表达式或完整JavaScript函数的字符串传递给查询系统。$where
提供了更大的灵活性,但要求数据库处理集合中每个文档的JavaScript表达式或函数。使用this
或obj