mongo find和聚合结果之间的冲突

时间:2016-08-26 09:05:01

标签: mongodb date mongoose

我正在尝试执行此聚合查询

[
    {
        "$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")
                };

我哪里错了?

1 个答案:

答案 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