mongodb - “SelectMany” - 在 mongodb 聚合管道中等效
问题描述
鉴于以下文件:
/* 1 */
{
"_id" : ObjectId("5f38fb2b52e28012a8f175f9"),
"date" : "2020-08-16",
"values" : {
"wert1" : 5.0,
"wert2" : 9.0
}
}
/* 2 */
{
"_id" : ObjectId("5f38fb2b52e28012a8f175fa"),
"date" : "2020-08-16",
"values" : {
"wert1" : 3.0,
"wert3" : 10.0
}
}
如何将其转换为如下内容:
{ "wert1": [ { "2020-08-16": "8.0" } ] },
{ "wert2": [ { "2020-08-16": "9.0" } ] },
{ "wert3": [ { "2020-08-16": "10.0" } ] }
理论上会是:
- “多选”
$values.$key
- 按值分组
$key
_$date
$sum
- 转换
这个“SelectMany”的运算符是什么?
解决方案
通常$unwind会充当SelectMany
. 在您的情况下,它有点复杂,因为您想按键名聚合,因此您还需要$ objectToArray和$arrayToObject运算符:
db.collection.aggregate([
{
$project: {
date: 1,
values: { $objectToArray: "$values" }
}
},
{ $unwind: "$values" },
{
$group: {
_id: { date: "$date", key: "$values.k" },
total: { $sum: "$values.v" }
}
},
{
$group: {
_id: "$_id.key",
v: { $push: { $arrayToObject: [ [ { k: "$_id.date", v: "$total" } ] ] } }
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: [ [ { k: "$_id", v: "$v" } ] ]
}
}
}
])
推荐阅读
- reactjs - 如何在 React 应用程序中集成 keycloak 身份验证?
- swift - 如何使用 UIdocumentpickercontroller 导出 MP3 文档?
- microsoft-edge - 第一次取消时,window.Print() 函数在 Microsoft Edge 中不起作用
- sql-server - 在磁盘中,1 页只属于 1 个块?
- java - 从 Spring Boot 中读取文件夹会导致 FileNotFound 异常
- android - 如何监听属性更新状态 o android
- c# - .NET Core 上 RestClient 和 HttpClient 发出的请求有什么区别
- flutter - 如何在我的颤动代码中保存敏感令牌
- jwt - 如何在 BizTalk 2013 R2 中存储 JWT 令牌?
- php - 使用 PHP 在 CSV 文件中搜索特定行并回显该行的特定字段