Javascript 基于日期的mongodb查询+;从文件开始的x天

Javascript 基于日期的mongodb查询+;从文件开始的x天,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,使用以下文档和道具来考虑这个mongo集合 {sku: '3344', frequency: 30, lastProccessedDate: 2021-01-07 15:18:07.576Z}, {sku: '2233', frequency: 30, lastProccessedDate: 2021-02-16 15:18:07.576Z}, {sku: '1122', frequency: 30, lastProccessedDate: 2021-04-13 15:18:07.576Z}

使用以下文档和道具来考虑这个mongo集合

{sku: '3344', frequency: 30, lastProccessedDate: 2021-01-07 15:18:07.576Z},
{sku: '2233', frequency: 30, lastProccessedDate: 2021-02-16 15:18:07.576Z},
{sku: '1122', frequency: 30, lastProccessedDate: 2021-04-13 15:18:07.576Z}

我想用
(lastProcessedDate+frequency(days))查询并获取所有文档。很遗憾,我无法为mongoose提供解决方案。但以下是Mongo查询,它返回您想要的结果:

db.getCollection("yourCollection").aggregate([
{
   $project: {
       _id: 1,
       sku: 1,
       frequency: 1,
       lastProccessedDate: 1,
       shiftedDate: {
           $add: [
               "$lastProccessedDate", { $multiply: [ 24 * 60 * 60 * 1000, "$frequency" ] }
           ]
       }
   } 
}, {
    $match: {
        shiftedDate: { $lte: new Date() } 
    }
}, {
    $project: {
        _id: 1,
       sku: 1,
       frequency: 1,
       lastProccessedDate: 1,
    }
}
])
首先,我们将文档转换为新的表单,其中包含相同的字段和一个新的临时字段,即定义为
lastprocessedDate+频率(天)
(请注意,我们实际上添加了毫秒,因此查询中有
24*60*60*1000
)。然后我们只选择
shiftedDate
小于(或等于)当前时间戳的文档(
newdate()
返回当前时间戳)。最后,我们将过滤后的文档转换为原始表单,而不使用以前用于过滤文档的临时字段


也许有一个更好的解决方案可以获取您想要的文档,但是这个方案也可以解决您的问题。

您可以使用
$set
而不是
$project
。然后保存所有的
xx:1