arrays - 将嵌套对象字段合并到 MongoDB 聚合中的单个嵌套数组字段中
问题描述
作为我的聚合管道的一部分,我有以下场景。这是对每个文档中先前展开的字段进行分组的结果(因此在这种情况下,有两个文档具有相同的 _id 但具有不同的 UniqueFieldName 值)
TopLevelField: [
{
UniqueFieldName: "Values go here!"
},
{
UniqueFieldName: "More values go here too!"
}
]
我要做的就是将嵌套对象字段合并到一个字段中,并将所有值作为数组推送到该字段中,就像这样。
TopLevelField: {
UniqueFieldName: [
"Values go here!",
"More values go here too!",
],
}
这个想法是我可以将多个字段与每个字段下的多个值组合在一起以便于迭代。
TopLevelField: {
UniqueFieldName: [
"Values go here!",
"More values go here too!",
],
SecondFieldName: [
"This is text",
],
AnotherOne: [
"TEXT",
"Here too!",
"More values",
],
}
我遇到的问题是尝试在 $group 阶段使用点表示法会引发错误。看来 mongo 不喜欢用这样的嵌套对象分组?
简单的解决方案是将 TopLevelField 更改为这样的嵌套字段的串联,
TopLevelField-UniqueFieldName: [
"Values go here!",
"More values go here too!",
],
TopLevelField-SecondFieldName: [
"This is text",
],
TopLevelField-AnotherOne: [
"TEXT",
"Here too!",
"More values",
],
但这对我的用例来说不是最理想的。是否有解决方案,还是我需要重新考虑整个管道?
解决方案
你可以试试这个:
db.collection.aggregate([
{ $unwind: '$TopLevelField' },
{
$group: {
_id: '', 'UniqueFieldName': { $push: '$TopLevelField.UniqueFieldName' },
'UniqueFieldName2': { $push: '$TopLevelField.UniqueFieldName2' },
'UniqueFieldName3': { $push: '$TopLevelField.UniqueFieldName3' },
'UniqueFieldName4': { $push: '$TopLevelField.UniqueFieldName4' }
}
}, { $project: { _id: 0 } }, { $project: { 'TopLevelField': '$$ROOT' } }])
测试: MongoDB-游乐场
推荐阅读
- c# - asp.net core 中的授权类型
- python - 使用一个小的声音文件来创作一首歌曲
- javascript - Nativescript - 使用 http 模块上传图片
- java - Java从解析的html表中获取数组
- c# - 为什么我的 do While 循环会导致无限循环?
- git - git推送到远程分支问题
- c# - ASP.NET Web 应用程序(.NET 框架)中的 asp.net core SignalR 配置
- android - 在 cognito 中发出 getUser 请求时访问令牌无效
- python - 输出超出 range() 函数中指定的最大值
- google-app-engine - GAE中生产模式下的Keystonejs:无法构建管理员用户界面