我正在尝试执行此聚合查询
[
{
"$match": {
"restaurantId": 138,
"createdAt": {
"$lte": "2016-08-27 23:59:59",
"$gte": "2016-08-19"
}
}
},
{
"$group": {
"_id": "null",
"count": { "$sum": 1 }
}
}
]
和普通查找查询
{
"restaurantId": 138,
"createdAt": {
"$lte": "2016-08-27 23:59:59",
"$gte": "2016-08-19"
}
}
此查找查询可以获得所需的结果。但汇总查询给了我[]
在数据库中,日期以这种格式存储:ISODate("2016-08-26T08:19:21.883+0000")
这就是我生成日期字符串的方式
filter.query.createdAt = {
"$lte": moment(Number(data.createdAt.to)).format("YYYY-MM-DD 23:59:59"),
"$gte": moment(Number(data.createdAt.from)).format("YYYY-MM-DD")
};
我哪里错了?
答案 0 :(得分:1)
您当前的查询是将存储的日期与字符串进行比较,您需要从字符串创建日期对象表示以使查询起作用。使用本机JS Date()
构造函数创建日期实例:
var end = new Date("2016-08-27 23:59:59"),
start = new Date("2016-08-19");
var pipeline = [
{
"$match": {
"restaurantId": 138,
"createdAt": { "$lte": end, "$gte": start }
}
},
{
"$group": {
"_id": null,
"count": { "$sum": 1 }
}
}
]
有关处理MongoDB中日期的更多详细信息,请参阅 docs ,但简而言之:
mongo shell提供了各种返回日期的方法,如: 字符串或Date对象:
Date()
方法,以字符串形式返回当前日期。- 的
new Date()
强> 构造函数,它使用ISODate()包装器返回Date对象。ISODate()
构造函数,它使用ISODate()返回Date对象 包装。在内部,Date对象存储为64位整数 表示自Unix时代以来的毫秒数(1月1日, 1970),这导致可表示的日期范围约为290 数百万年的过去和未来。
如果您使用的是momentjs库,请使用 toDate()
扩展方法返回日期对象:
var end = moment(Number(data.createdAt.to)).toDate(),
start = moment(Number(data.createdAt.from)).toDate();
要将23:59:59附加到日期,您可以使用当前日期对象上的startOf()
和endOf()
方法,将字符串'day'
作为参数传递:
var start = moment(Number(data.createdAt.from)).startOf('day').toDate(); // set to 12:00 am for that date
var end = moment(Number(data.createdAt.to)).endOf('day').toDate(); // set to 23:59 pm for that date