我想将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进行比较的字段的值?
谢谢
答案 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"]}
}
}
])