有没有办法将字符串聚合为日期。 ?
我的字段看起来像这样。它不是日期字段,而是字符串。
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:
将此字段从字符串转换为日期是我的最后一个选项。
那么,有没有其他方法来聚合字符串字段?
答案 0 :(得分:1)
首先,您需要在mongodb中将字符串转换为日期类型
使用Aggregate功能显示day
,month
和year
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,然后进行分组。