无法在MongoDB View Query中获取当前日期

时间:2017-10-09 03:37:04

标签: mongodb

我们有meteor app,我们使用mongodb作为数据库。现在,由于在mongodb上已经可以使用VIEW功能,我们尝试使用它来生成报告。但是,我们在收集日期字段和当前日期时遇到问题,我们甚至无法使用$ project下的mongodb聚合检索当前日期字段,因为我们不知道获取当前日期的正确语法。我们的目标是,因为它正在使用视图,我们希望将新的Date()(以下代码中的今天的日期)替换为mongodb的当前日期方法。

"waiting_for_appointment" : {
            $cond : {
                if: { $eq: ["$current_status", "Waiting For Appointment"]},
                then: {
                    $cond : {
                         if: {$gt: [{$subtract: [ new Date(), "$statuses.waiting_for_appointment.from_date" ]}, 0]},
                         then: {
                            $cond: {
                                if: {$gt: [{$subtract: [ "$statuses.waiting_for_appointment.to_date", "$statuses.waiting_for_appointment.from_date" ]}, 0]},
                                then: {$multiply : [{
                                    $divide: [{$subtract: [ new Date(), "$statuses.waiting_for_appointment.from_date" ]}, {$subtract: [ "$statuses.waiting_for_appointment.to_date", "$statuses.waiting_for_appointment.from_date" ]}]
                                    }, 100]
                                },
                                else: 0
                            }
                         },
                         else: 0
                    }
                },
                else: -1
            }
        },

查询工作正常但是当我再次编辑VIEW查询时,我发现它被转换为静态日期,即保存查询的日期。这是保存查询并将其编辑回来后得到的结果。

ISODate("2017-10-09T02:12:42.282+0000")

这就是为什么,如果更改日期,查询将无效。

提前致谢。

2 个答案:

答案 0 :(得分:0)

通常,当您设置对象文字(在这种情况下您正在使用整个查询)时,对象中的所有被调用函数都会在实例化对象时被调用。

注意:我没有完成您的复杂查询。我真的只是在谈论更新日期的问题,并假设查询结构合理。

我不知道你的用例,但如果你可以将它作为一个函数而不是一个对象来调用,那么你可以很容易地在调用时获得更新的参数。

const someObj = {

    "waiting_for_appointment" : function( currentDate ) {
        $cond : {
            if: { $eq: ["$current_status", "Waiting For Appointment"]},
            then: {
                $cond : {
                     if: {$gt: [{$subtract: [ currentDate, "$statuses.waiting_for_appointment.from_date" ]}, 0]},
                     then: {
                        $cond: {
                            if: {$gt: [{$subtract: [ "$statuses.waiting_for_appointment.to_date", "$statuses.waiting_for_appointment.from_date" ]}, 0]},
                            then: {$multiply : [{
                                $divide: [{$subtract: [ currentDate, "$statuses.waiting_for_appointment.from_date" ]}, {$subtract: [ "$statuses.waiting_for_appointment.to_date", "$statuses.waiting_for_appointment.from_date" ]}]
                                }, 100]
                            },
                            else: 0
                        }
                     },
                     else: 0
                }
            },
            else: -1
        }
    },

}

然后someObj['waiting_for_appointment'](new Date())将返回具有当前日期时间的查询对象。

答案 1 :(得分:0)

从 MongoDB 4.2 开始,您现在可以使用变量 $$NOW。

https://docs.mongodb.com/manual/reference/operator/update/currentDate/

{
   current_date: '$$NOW'
}

如果您想在视图内的聚合中使用它,您也可以将它与 $addFields 结合使用。例如:

[
 {
    $addFields: {
        current_date: '$$NOW'
    }
 }, 
 {
    $project: {
        differenceMilli: {
            $subtract: [
            '$current_date',
            '$updated_at'
        ]
    }
 }
]