Mongodb mongo find与聚合结果之间的冲突

Mongodb mongo find与聚合结果之间的冲突,mongodb,date,mongoose,Mongodb,Date,Mongoose,我有一个正在尝试执行的聚合查询 [ { "$match": { "restaurantId": 138, "createdAt": { "$lte": "2016-08-27 23:59:59", "$gte": "2016-08-19" } } }, { "$group": {

我有一个正在尝试执行的聚合查询

[
    {
        "$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"
    }
}
这个find查询得到了所需的结果。但是聚合查询给了我
[]
数据库中的日期以以下格式存储:
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")
                };

哪里出错了?

您当前的查询正在将存储的日期与字符串进行比较,您需要从字符串创建日期对象表示形式,以便查询正常工作。使用本机JS构造函数创建日期实例:

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中处理日期的更多详细信息,请参阅,但简而言之:

mongo shell提供了各种方法来返回日期,如 作为日期对象的字符串或字符串:

  • Date()
    方法,该方法以字符串形式返回当前日期
  • 新日期()
    构造函数,它使用ISODate()包装返回日期对象
  • ISODate()
    使用ISODate()返回日期对象的构造函数 包装纸
在内部,日期对象存储为64位整数 表示自Unix纪元(1月1日, 1970年),其可代表的日期范围约为290 数百万年过去和未来


如果使用momentjs库,请使用扩展方法返回日期对象:

var end = moment(Number(data.createdAt.to)).toDate(),
    start =  moment(Number(data.createdAt.from)).toDate();
要将23:59:59追加到日期,您可以在时刻的日期对象上使用and方法,将字符串
'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

添加了关于我如何生成日期字符串的问题。您需要在矩对象上调用
.toDate()
,以返回对序列化有效的JavaScript日期对象,但我需要在请求中获得的日期后追加23:59:59。我已使用适当的方法更新了我的答案,以便在您希望追加时间时使用。“$gte”:“2016-08-19”应带有时间“$gte”:“2016-08-19 00:00:00”