MongoDb 如何从字符串中按月和年分组
MongoDb How to group by month and year from string
我在集合中有字段 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 on anything else that is tho a Date
object itself. Your ultimate best option is to convert these "strings" to proper Date
对象,因此您可以在此操作和以后的操作中正确查询。
就是说,如果您的 "strings" 总是有一个共同的结构,那么有一种方法可以使用 aggregation framework tools. It requires a lot of manipulation thought that does not makes this an "optimal" approach to dealing with the problem. But with a set structure of "double digits" and a consistent delimiter this is possible with the $substr
运算符来做到这一点:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
因此 JavaScript 转换在聚合框架内不起作用。您始终可以根据 "client code" 评估 "feed" 输入到管道,但聚合过程本身不会评估任何代码。就像基本的查询引擎一样,这都是基于使用 "native operator" 指令完成工作的 "data structure" 实现。
您不能在聚合管道中将字符串转换为日期。您应该使用真实的 BSON Date
对象,但如果存在可以在 "lexical order".
中呈现的一致格式,则可以使用字符串来实现
我仍然建议您尽快将它们转换为 BSON Dates
。请注意 "ISODate" 或 UTC 值是用不同的字符串形式构造的。即:
new Date("2020-01-07")
正在使用 "yyyy-mm-dd" 格式。至少对于 JavaScript 调用。
我在集合中有字段 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 on anything else that is tho a Date
object itself. Your ultimate best option is to convert these "strings" to proper Date
对象,因此您可以在此操作和以后的操作中正确查询。
就是说,如果您的 "strings" 总是有一个共同的结构,那么有一种方法可以使用 aggregation framework tools. It requires a lot of manipulation thought that does not makes this an "optimal" approach to dealing with the problem. But with a set structure of "double digits" and a consistent delimiter this is possible with the $substr
运算符来做到这一点:
db.collection.aggregate([
{ "$group": {
"_id": {
"year": { "$substr": [ "$dateStr", 7, 4 ] },
"month": { "$substr": [ "$dateStr", 4, 2 ] }
},
"count": { "$sum": 1 }
}}
])
因此 JavaScript 转换在聚合框架内不起作用。您始终可以根据 "client code" 评估 "feed" 输入到管道,但聚合过程本身不会评估任何代码。就像基本的查询引擎一样,这都是基于使用 "native operator" 指令完成工作的 "data structure" 实现。
您不能在聚合管道中将字符串转换为日期。您应该使用真实的 BSON Date
对象,但如果存在可以在 "lexical order".
我仍然建议您尽快将它们转换为 BSON Dates
。请注意 "ISODate" 或 UTC 值是用不同的字符串形式构造的。即:
new Date("2020-01-07")
正在使用 "yyyy-mm-dd" 格式。至少对于 JavaScript 调用。