Mongo聚合的日期范围是否已被破坏?

时间:2016-04-19 18:59:59

标签: mongodb aggregation-framework

我有一个带有字符串字段的文档集合" action"和#34; receivedTimestamp"日期字段,其所有值均来自2016年3月和4月。我试图计算日期范围内每个操作的数量。

当我运行时:

db.getCollection('foo').aggregate([
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到68个结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$gte": new Date("2016-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到68个结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$gte": new Date("2017-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到68个结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$lte": new Date("2017-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到0结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$lte": new Date("2016-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到0结果。

因此,我真的开始认为Mongo聚合的日期范围已经破裂。我错了吗?

1 个答案:

答案 0 :(得分:0)

通过切换到ISODate来解决这个问题:

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$gte": new ISODate("2016-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到68个结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$gte": new ISODate("2017-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到0结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$lte": new ISODate("2016-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到0结果。

当我运行时:

db.getCollection('foo').aggregate([
  {"$match": {"receivedTimestamp": {"$lte": new ISODate("2017-01-01")}}}, 
  {"$group": {"_id":   "$action", "count": {"$sum": 1}}}
])

我得到68个结果。

这是我期望看到的行为。我不知道在这种情况下使用ISODate的要求的任何文件。