Mongodb sql中组concat的模拟
在聚合过程中,我得到了以下数据:Mongodb sql中组concat的模拟,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,在聚合过程中,我得到了以下数据: { “_id”:“计费/默认控制器/操作索引”, “最小时间”:0.033, “最长时间”:5.25, “执行时间”:555.4909997, “qt”:9059, “计数”:2, “日期”:[ ISODate(“2014-02-10T00:00:00.000Z”), ISODate(“2014-02-11T00:00:00.000Z”) ] }, 如何更改我的查询: db.page\u speed\u reduced.aggregate([ {$group:
{
“_id”:“计费/默认控制器/操作索引”,
“最小时间”:0.033,
“最长时间”:5.25,
“执行时间”:555.4909997,
“qt”:9059,
“计数”:2,
“日期”:[
ISODate(“2014-02-10T00:00:00.000Z”),
ISODate(“2014-02-11T00:00:00.000Z”)
]
},
如何更改我的查询:
db.page\u speed\u reduced.aggregate([
{$group:{
_id:“$value.route”,
最小时间:{$min:$value.min\u-time},
max_time:{$max:$value.max_time},
执行时间:{$sum:$value.exec_time},
qt:{$sum:$value.qt},
计数:{$sum:numberprint(1)},
日期:{$push:“$\u id.date”},
}}
]);
要将“$date”作为串联字符串获取,请执行以下操作:
2014-02-102014-02-11
更新:
我尝试了这个变体,但mongodb产生了错误:
db.page\u speed\u reduced.aggregate([
{$group:{
_id:“$value.route”,
最小时间:{$min:$value.min\u-time},
max_time:{$max:$value.max_time},
执行时间:{$sum:$value.exec_time},
qt:{$sum:$value.qt},
计数:{$sum:numberprint(1)},
日期:{$push:“测试钉住”},
}},
{$项目:{
'日期':{$concat:['$date']}
//'date':{$concat:'$date'}//出现一些错误
}}
]);
未捕获异常:聚合失败:{
“errmsg”:“异常:$concat仅支持字符串,不支持数组”,
“代码”:16702,
“确定”:0
}
'日期':{$concat:'$date'}
此链接可能会给您一个提示:
年份:{$concat:[$year]}根据到目前为止的评论,不清楚你在分组什么,或者你想要什么作为最终结果,除了说你想把你的日期连接成类似“仅仅一天”的东西,没有时间或分钟。想必你为了某种目的想要那些不同的日子 您可以在日期上使用不同的管道,并且操作员也是。不幸的是,所有的日期运算符都会生成一个整数作为其结果,并且对于所需的日期字符串排序,$concat只能处理字符串。另一个问题是,不能在聚合中将整数转换为字符串类型 但是您可以使用子文档,这里我们只处理日期:
db.record.aggregate([
//展开阵列以使用它
{$unwind:“$date”},
//将项目导入我们的新“日”文档中
{$project:{
日期:{
年份:{$year:$date},
月份:{$month:$date},
日期:{$dayOfMonth:$date}
}
} },
//如果日期顺序重要,可选择排序[最早->最新]
{$sort:{“day.year”:-1,“day.month”:-1,“day.day”:-1},
//将唯一值回卷到数组中
{$group:{{U id:$\U id],天数:{$addToSet:“$day”}}
])
因此,它不是一个字符串,但可以很容易地将其后处理为一个字符串,但最重要的是它是分组和可排序的
如果希望唯一的日期
以这种方式作为末尾的数组,或者是否希望按这些日期对总计进行分组,则原则保持不变。因此,首先要记住使用日期操作符的$unwind和$project部分
--编辑--
多亏了社区,如中所示,$substr有一种未记录的行为,其中整数可以转换为字符串
db.record.aggregate([
//展开阵列以使用它
{$unwind:“$date”},
//将项目导入我们的新“日”文档中
{$project:{
日期:{
年份:{$year:$date},
月份:{$month:$date},
日期:{$dayOfMonth:$date}
}
} },
//如果日期顺序重要,可选择排序[最早->最新]
{$sort:{“day.year”:-1,“day.month”:-1,“day.day”:-1},
//现在我们要投射到一个字符串**magic@heinob**
{$project:{
日期:{$concat:[
{$substr:[“$day.year”,0,4]},
"-",
{$substr:[“$day.month”,0,2]},
"-",
{$substr:[“$day.day”,0,2]}
]}
}},
//将唯一值回卷到数组中
{$group:{{U id:$\U id],天数:{$addToSet:“$day”}}
])
现在,
days
是字符串。正如我前面提到的,如果排序对您来说很重要,那么最好的方法是按照已经完成的方式投影到文档类型中,并按数字键排序。当然,转换日期的$project可以简化为$group阶段,这可能是处理整个文档时需要执行的操作。您好,谢谢,但它不起作用(我用代码更新问题example@Hett你回来看答案了吗?我想你的需求得到了满足。你是想得到“缩短日期”的“集合”吗,作为一天,被推到按原始文档的\u id
分组的数组中?只是确保这是您想要的。或者您想在这些日期前对求和
?我们不确定,因为您还引用了文档中未列出的字段。