mongodb - 具有动态字段名称的 mongo 组查询
问题描述
我正在尝试为两个级别的分组结果创建一个 mongoquery。首先按文件夹,然后按名称。
收藏:
[
{
folder: "A",
name: "Apple",
color: "red"
},
{
folder: "A",
name: "Banana",
color: "green"
},
{
folder: "A",
name: "Apple",
color: "yellow"
},
{
folder: "B",
name: "Cherry",
color: "green"
}
]
预期结果:
{
A:{
Apple:[item1, item3]
Banana:[item2]
},
B:{
Cherry:[item4]
},
}
我已经有一个接近的结果,但问题是我无法输入动态字段名称,我的查询:
db.collection.aggregate([
{
$group: {
_id: {
folder: "$folder",
name: "$name"
},
files: {
$push: "$$ROOT"
},
},
},
{
"$group": {
"_id": "$_id.name",
"files": {
$push: {
"{ThisMustBeTheName}": "$files"
}
},
}
}
])
https://mongoplayground.net/p/Bq1qYZN7j4v
任何想法或建议?
解决方案
db.collection.aggregate([
{
$group: {
_id: {
folder: "$folder",
name: "$name"
},
files: {
$push: "$$ROOT"
},
},
},
{
"$group": {
"_id": "$_id.name",
"files": { //To make replace root syntax correct
$push: {
"k": "$_id.name",
"v": "$files"
}
}
}
},
{
"$replaceRoot": { //It does the dynamic naming part
"newRoot": {
"$mergeObjects": [
{
"$arrayToObject": "$files"
}
]
}
}
}
])
另一个更新:
db.collection.aggregate([
{
$group: {
_id: {
folder: "$folder",
name: "$name"
},
files: {
$push: "$$ROOT"
},
},
},
{
"$group": {
"_id": "$_id.name",
"files": {
$push: {
"k": "$_id.name",
"v": "$files"
}
},
"folder": {
$first: "$files.folder"
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"$arrayToObject": "$files"
},
{
"folder": {
$first: "$folder"
}
}
]
}
}
},
{
"$group": {
"_id": "$folder",
"data": {
"$push": "$$ROOT"
}
}
},
{
$group: {
"_id": "$_id",
"d": {
$push: {
"k": "$_id",
"v": "$data"
}
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"$arrayToObject": "$d"
}
]
}
}
}
])
推荐阅读
- django - 为什么注释重复我的查询集对象?
- c# - 开发存储帐户需要身份验证
- angular - 模块构建失败:@import '../../node_modules/@angular/material/toolbar/toolbar';
- python - PYTHON - imap over TLS
- python - 根据列在数据框中添加或减去两列?
- c# - 单选按钮的背景颜色
- python - 在连续使用 3 个 if 语句时,即使第三个是真的,它什么也不做
- java - 如何从 MockMultipartFile 在 Spring MVC 测试中生成异常?
- google-cloud-platform - 在阿里云上部署 Apache Beam 管道
- c# - ASP.NET MVC 中的 iframe