MongoDb如何按字符串按月和年分组

时间:2015-01-08 08:54:17

标签: mongodb mongodb-query aggregation-framework

我在集合中有字段dateStr

  {  ....    "dateStr" : "07/01/2020" .... }
  {  ....    "dateStr" : "07/01/1970"   .... }

我想从dateStr字段按月和年分组

我试过了

    db.collection.aggregate( 
       {$project : { 
              month : {$month : new Date("$dateStr")}, 
              year : {$year :  new Date("$dateStr")}
          }}, 
        {$group : { 
                _id : {month : "$month" ,year : "$year" },  
              count : {$sum : 1} 
        }})

输出:

{
"result" : [ 
        {
            "_id" : {
                "month" : 1,
                "year" : 1970
            },
            "count" : 2
        }
    ],
    "ok" : 1
}

但我有两年1970,2020。为什么我会获得单曲?

1 个答案:

答案 0 :(得分:7)

您不能在date aggregation operators对象本身的任何其他内容上使用Date。您最终的最佳选择是转换这些"字符串"到正确的Date对象,这样您就可以在此操作和将来的操作中正确查询。

那就是说,如果你的"字符串"总是有一个共同的结构,然后有一种方法可以使用aggregation framework工具。它需要大量的操作思维,这并不能使它成为最佳的#34;处理问题的方法。但是设置了一个"两位数的结构"使用$substr运算符可以实现一致的分隔符:

db.collection.aggregate([
   { "$group": {
       "_id": {
           "year": { "$substr": [ "$dateStr", 7, 4 ] },
           "month": { "$substr": [ "$dateStr", 4, 2 ] }
       },
       "count": { "$sum": 1 }
   }}
])

因此,JavaScript聚合在聚合框架内不起作用。你可以随时"饲料"基于"客户端代码"输入到管道。评估,但聚合过程本身不评估任何代码。就像基本的查询引擎一样,这都是基于"数据结构"使用" native运算符"的实现这项工作的指示。

您无法将字符串转换为聚合管道中的日期。你应该使用真正的BSON Date个对象,但如果有一个一致的格式你可以用一个词法顺序"那么你就可以用字符串来做。

我仍然建议您尽快将这些转换为BSON Dates。并且要注意" ISODate"或UTC值使用不同的字符串形式构造。即:

new Date("2020-01-07")

进入" yyyy-mm-dd"格式。至少对于JavaScript调用。