Mongo group by date实际上是一个字符串数据类型

时间:2015-02-25 11:23:02

标签: mongodb mongoid

有没有办法将字符串聚合为日期。 ?

我的字段看起来像这样。它不是日期字段,而是字符串。

CreatedDate => "2014-11-24T11:14:51.000+0000

现在我要分组(Moped查询)

{ "$group" => { _id: { day: { "$dayOfMonth" => "$CreatedDate"}, month: {"$month" => "$CreatedDate"}, year: { "$year" => "$CreatedDate" } }

运行查询时出现以下错误。

"exception: can't convert from BSON type String to Date"

P.S:

将此字段从字符串转换为日期是我的最后一个选项。

那么,有没有其他方法来聚合字符串字段?

2 个答案:

答案 0 :(得分:1)

首先,您需要在mongodb中将字符串转换为日期类型 使用Aggregate功能显示daymonthyear

collection name: testdata包含

myDevReplSet:PRIMARY> db.testdata.find()
{ "_id" : ObjectId("54edbd94e84aac1464560025"), "CreatedDate" : "2014-11-24T11:14:51.000+0000" }
{ "_id" : ObjectId("54edbd9fe84aac1464560026"), "CreatedDate" : "2014-12-06T11:14:51.000+0000" }
{ "_id" : ObjectId("54edbdabe84aac1464560027"), "CreatedDate" : "2014-07-05T11:14:51.000+0000" }
{ "_id" : ObjectId("54edbdb8e84aac1464560028"), "CreatedDate" : "2014-08-15T11:14:51.000+0000" }

使用以下代码将CreatedDate字段从字符串转换为ISODate

myDevReplSet:PRIMARY>db.testdata.find().forEach(function(element){
  element.CreatedDate = ISODate(element.CreatedDate);
  db.testdata.save(element);
})

testdata集合如下所示

myDevReplSet:PRIMARY> db.testdata.find()
{ "_id" : ObjectId("54edbd94e84aac1464560025"), "CreatedDate" : ISODate("2014-11-24T11:14:51Z") }
{ "_id" : ObjectId("54edbd9fe84aac1464560026"), "CreatedDate" : ISODate("2014-12-06T11:14:51Z") }
{ "_id" : ObjectId("54edbdabe84aac1464560027"), "CreatedDate" : ISODate("2014-07-05T11:14:51Z") }
{ "_id" : ObjectId("54edbdb8e84aac1464560028"), "CreatedDate" : ISODate("2014-08-15T11:14:51Z") }

使用mongodb聚合函数显示日,月和年

db.testdata.aggregate([
                   { 
                       "$group" : { _id: { 
                                           day: { "$dayOfMonth" : "$CreatedDate"}, 
                                           month: {"$month" : "$CreatedDate"}, 
                                           year: { "$year" : "$CreatedDate"} 
                                      } } }
                 ]                    
               )

<强>结果:

{ "_id" : { "day" : 15, "month" : 8, "year" : 2014 } }
{ "_id" : { "day" : 5, "month" : 7, "year" : 2014 } }
{ "_id" : { "day" : 6, "month" : 12, "year" : 2014 } }
{ "_id" : { "day" : 24, "month" : 11, "year" : 2014 } }

希望它有所帮助。

答案 1 :(得分:1)

嗨如果假设以下条件

1&GT; month以0开头,如果是2月,那么它将是02

2 - ; day以0开头,例如:如果低于&lt; = 9的日期将开始01,02,...,09等

然后在聚合工作之下,而不将数据类型字符串更改为ISODate

    db.collectionName.aggregate({
    "$group": {
        "_id": {
            "year": {
                "$substr": ["$CreatedDate", 0, 4]
            },
            "month": {
                "$substr": ["$CreatedDate", 5, 2]
            },
            "day": {
                "$substr": ["$CreatedDate", 8, 2]
            }
        }
    }
})

如果上述假设不可行,请按照 Manjunath H 回答,例如首先将字符串转换为ISODate,然后进行分组。