有没有一种方法可以更改在find()函数中与im进行比较的字段的值?

时间:2018-07-22 15:00:36

标签: javascript node.js mongodb mongoose

我想将date字段与dateRange进行比较。 这是我的原始代码:

let results=Show.find({_MovieId: paramMovieId, date : {$in : dateRange}},{});

但是我想将日期字段与较小的操作进行比较。像这样的东西:

let results=Show.find({_MovieId: paramMovieId, moment(date).add(1,'d').format('YYYY-MM-DD'): {$in : dateRange}},{});

我似乎无法运行此代码,这似乎是不可能完成的任务。

有人知道有没有一种方法可以更改在find()函数中与im进行比较的字段的值?

谢谢

2 个答案:

答案 0 :(得分:2)

使用 $expr 运算符,您可以构建查询表达式,该表达式允许您操作日期字段并将其与某些表达式列表进行比较。

在以下示例中, $expr conditional statement(例如 $setIsSubset )一起使用以比较转换后的日期字段(a day added)与find()方法中的dateRange数组

db.show.find({
    '$expr': {
        '$setIsSubset': [
            [ { '$dateToString': { 
                'format': '%Y-%m-%d',
                'date': { '$add': [ '$date', 24*60*60000 ] } 
            } } ], 
            dateRange
        ]
    }
})

使用 $dateToString ,您可以指定另一个名为timezone的选项,用于设置操作结果的时区,例如在津巴布韦哈拉雷的当地时区

{ '$dateToString': {
    'date': '$date',
    'format': '%Y-%m-%d',
    'timezone': 'Africa/Harare'
} }

使用Olson Timezone Identifier格式作为操作的时区,并且

{ '$dateToString': {
    'date': '$date',
    'format': '%Y-%m-%d',
    'timezone': '+02'
} }

使用UTC offset格式指定时区。

答案 1 :(得分:1)

您可以使用聚合框架来做到这一点。要覆盖现有字段,您需要$addFields阶段,在该阶段可以使用$add向当前日期对象添加一天,并使用$dateToString格式化日期。在Mongo Shell中尝试:

db.show.save({_MovieId: 1, date: new Date()}) // inserts today


db.show.aggregate([
    {
        $addFields: {
            date: {
                $dateToString: {
                    format: "%Y-%m-%d",
                    date: { $add: [ "$date", 1*24*60*60000 ] }
                }
            }
        }
    },
    {
        $match: {
            _MovieId: 1, date: { $in : ["2018-07-23"]}
        }
    }
])