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

MongoDb如何从字符串按月份和年份分组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在收集字段dateStr { .... "dateStr" : "07/01/2020" .... } { .... "dateStr" : "07/01/1970" .... } 我想从dateStr字段按月份和年份分组 我试过了 db.collection.aggregate( {$project : { month : {$month : new Date("$dateStr")},

我正在收集字段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年。为什么我会得到一张唱片

不能在对象本身以外的任何对象上使用。您最终的最佳选择是将这些“字符串”转换为适当的对象,这样您就可以在此操作和将来的操作中正确查询

也就是说,如果你的“字符串”总是有一个共同的结构,那么有一种方法可以通过工具来实现。它需要大量的操作思想,但这并不能使它成为处理问题的“最佳”方法。但是,使用“两位数”的集合结构和一致的分隔符,可以使用运算符:

db.collection.aggregate([
{“$组”:{
“_id”:{
“年份:{“$substr”:[“$dateStr”,7,4]},
“月”:{“$substr”:[“$dateStr”,4,2]}
},
“计数”:{“$sum”:1}
}}
])
因此JavaScript转换在聚合框架内不起作用。您始终可以基于“客户机代码”评估将输入“馈送”到管道,但聚合过程本身不会评估任何代码。与基本查询引擎一样,这一切都基于“数据结构”实现,使用“本机运算符”指令来完成工作

不能在聚合管道中将字符串转换为日期。您应该使用真实的对象,但是如果有一种一致的格式,您可以以“词汇顺序”表示,那么您可以使用字符串

我仍然建议您尽快将这些转换为日期。请注意,“ISODate”或UTC值是用不同的字符串形式构造的。即:

新日期(“2020-01-07”)

采用“yyyy-mm-dd”格式。至少是JavaScript调用。

谢谢。这很有帮助。它正在工作。我同意你的观点。我将根据bson date对象进行适当的分组。@Ramesh好消息。然后可以使用原始代码示例中所示的。