mongodb - MongoDB中的数据类型转换

标签 mongodb mongodb-query aggregation-framework

我在 MongoDB 中有一个名为 Document 的集合。此集合中的文档有一个名为 CreationDate 的字段,以 ISO 日期类型存储。我的任务是统计每天创建的文档数量并按数量异步排序。输出格式必须是 [{_id:'yyyy-MM-dd', cnt:x}]。我尝试使用如下聚合框架。

db.Document.aggregate( 
    , {$project: {_id:1, Year:{$year:'$CreationDate'}, Month:{$month:'$CreationDate'}, Date:{$dayOfMonth:'$CreationDate'}}}
    , {$group: {_id:{$concat:['$Year', '-', '$Month', '-', '$Date']}, cnt:{$sum:1}}}
    , {$sort:{'cnt':-1}}
);

代码给我的错误如下:

$concat only supports strings, not NumberInt32

我理解这是因为 $year、$month 和 $dayOfMonth 都返回数字。可以将 _id 字段组合为一个对象,并在应用程序级别将其重新格式化为所需的格式。

但从技术角度来看,我有两个问题:

  1. 如何在 MongoDB shell 中将数字转换为字符串?在这种情况下,然后可以将 $year 的输出转换为字符串并在 $concat 中使用。

  2. 有没有更好的方法将 ISODate 输出格式化为各种日期格式?在许多情况下,我们只需要 ISODate 的某些部分,例如:日期部分或时间部分。是否有任何 MongoDb 内置运算符来实现这一点?

提前感谢您的任何建议。

最佳答案

您可以使用 $concat 来执行此操作但首先您需要通过 $substr 转换为字符串,也处理两位数的情况:

db.Document.aggregate([ 
    { "$group": { 
        "_id":{ 
            "$concat": [
                 { "$substr": [ { "$year": "$CreationDate" }, 0, 4 ] },
                 "-",
                 { "$cond": [
                     { "$gt": [ { "$month": "$CreationDate" }, 9 ] },
                     { "$substr": [ { "$month": "$CreationDate" }, 0, 2 ] },
                     { "$concat": [
                         "0",
                         { "$substr": [ { "$month": "$CreationDate" }, 0, 1 ] },
                     ]},
                 ]},
                 "-",
                 { "$cond": [
                     { "$gt": [ { "$dayOfMonth": "$CreationDate" }, 9 ] },
                     { "$substr": [ { "$dayOfMonth": "$CreationDate" }, 0, 2 ] },
                     { "$concat": [
                         "0",
                         { "$substr": [ { "$dayOfMonth": "$CreationDate" }, 0, 1 ] },
                     ]}
                 ]}
             ]
         },
         { "cnt": { "$sum": 1 } }
    }}
    { "$sort":{ "cnt" :-1 }}
]);

可能更好的是只使用日期数学,这会返回一个纪元时间戳值,但在后期处理中很容易处理日期对象:

db.Document.aggregate([
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$CreationDate", new Date("1970-01-01") ] },
                { "$mod": [
                    { "$subtract": [ "$CreationDate", new Date("1970-01-01") ] },
                    1000 * 60 * 60 * 24
                ]}
            ]
        },
        "cnt": { "$sum": 1 }
    }},
    { "$sort": { "cnt": -1 } }
])

关于mongodb - MongoDB中的数据类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25176855/

相关文章:

java - mongodb 中的日期不正确

javascript - BackboneJS 模型方法 'get' 不考虑 idAttribute 设置

node.js - Mongodb 仅根据字段值更新为三级嵌入文档

javascript - Mongo 日期范围查询 (GMT)

javascript - 使用 mongodb/mongoose 有条件地将 5-20k 文档的输入批处理处理为包含多达一百万个文档的集合的有效方法是什么?

ruby-on-rails - Rails 有两个不同的数据库

javascript - 在 MongoDB 中使用异步/等待时,在应用游标方法之前获取文档总数?

node.js - 避免总计 16MB 的限制

MongoDB:按子文档分组并计数+添加总计数

javascript - Mongo 在单个字段(二维数组)上设置交集