我可以通过这个搜索找到一个项目:
db.item.find({"startdate":{$gte: 1485521569000 }})
日期似乎对应
> new Date(1485521569000)
ISODate("2017-01-27T12:52:49Z")
但如果我搜索
db.item.find({"startdate":{"$gte" : ISODate("2017-01-01T00:00:00Z")}})
我没有得到任何结果。我做错了什么?
PS我找到的唯一方法是
db.item.find({"startdate":{"$gte" : (new Date("2017-01-01")).getTime()}})
是这样还是有更好的方法?
下面一个就可以了。
db.getCollection('test').find({
"key": {
"$gte": (ISODate("2017-01-01")).getTime()
}
})
原因:
您的数据在int64
或long
中
在new Date
查询中,您正在将日期转换为返回int
的时间。因此get
执行integer
比较。
在ISODate
中,您正在传递一个日期,它不会将日期转换为integer
,即毫秒。因此,如果你转换,两者都会起作用。
new Date((将当前日期作为Date对象返回。mongo shell使用ISODate帮助程序包装Date对象
var d = ISODate("2017-01-01")
print(d); //Sun Jan 01 2017 05:30:00 GMT+0530 (IST)
因此,比较失败了。
如果我理解,您在startdate
字段中有时间戳,
这是一个选项,如果有帮助的话,可以使用aggregate((函数,使用$toDate,
$toDate
将时间戳转换为ISO日期
db.collection.aggregate([
{
$match: {
$expr: {
$gte: [
{
$toDate: "$startdate"
},
ISODate("2017-01-27T12:52:49.000Z")
]
}
}
}
])
游乐场:https://mongoplayground.net/p/H7SFHsgOcCu