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

标签 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 年。为什么我得到单条记录?

最佳答案

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

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

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

因此 JavaScript 转换在聚合框架内不起作用。您始终可以根据“客户端代码”评估将输入“馈送”到管道,但聚合过程本身不会评估任何代码。就像基本的查询引擎一样,这都是基于使用“ native 运算符”指令来完成工作的“数据结构”实现。

您不能在聚合管道中将字符串转换为日期。你应该使用真正的 BSON Date对象,但如果存在可以按“词汇顺序”呈现的一致格式,则可以使用字符串来实现。

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

new Date("2020-01-07")

采用“yyyy-mm-dd”格式。至少对于 JavaScript 调用而言。

关于MongoDb如何从字符串中按月和年分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27836166/

相关文章:

javascript - 导入的成员无法创建 Mongoose 模型

javascript - 使用 javascript 在 mongodb 终端中创建查询

mongoose - mongoose 新版本中是否已弃用 exexPopulate() 方法?

Mongodb 数组串联

MongoDB:执行存储的 JavaScript 函数时出错

node.js - 如何将 forEach 与 Promises.all 结合起来

node.js - 如何在 Mongodb 上实现行级安全性 (RLS)

MongoDB物化 View -如何增量更新输出结果?

node.js - 如何在nodeJS和mongoDB中进行聚合

java - MongoDB聚合不能使用$limit两次