这就是我的文档的样子:
[
{
"_id": {
"$oid": "633a982186c443b693dc240c"
},
"date": "2022-09-27",
"file": "file_1",
"package": 1,
"packagecode": "xy/1",
"pshIdList": [],
"userList": [
{
"userName": "user_1",
"crDate": "2022.09.28",
"boolId": 1
}
]
},
{
"_id": {
"$oid": "633a982186c443b693dc240d"
},
"date": "2022-09-27",
"file": "file_2",
"package": 2,
"packagecode": "xy/2",
"pshIdList": [],
"userList": []
}
]
由于前端的出现(我必须显示一个树结构(,我需要按以下方式对文档进行分组:
db.collection.aggregate([
{
$set: {
"username": {
$filter: {
input: "$userList",
as: "user",
cond: {
"$eq": [
"$$user.boolId",
1
]
}
}
}
}
},
{
$set: {
"username": {
$arrayElemAt: [
"$username",
0
]
}
}
},
{
$set: {
"username": {
$ifNull: [
"$username.userName",
"na"
]
}
}
},
{
$group: {
_id: {
"date": {
$concat: [
"date: ",
"$date",
]
},
"file": {
$concat: [
"file: ",
"$file"
]
},
},
"items": {
$push: {
"items": {
$concat: [
"$packagecode",
" - ",
"$username"
]
}
}
}
}
},
{
$group: {
_id: "$_id.date",
"items": {
$push: {
"file": "$_id.file",
"items": "$items"
}
}
}
}
])
这是聚合的结果:
[
{
"_id": "date: 2022-09-27",
"items": [
{
"file": "file: file_1",
"items": [
{
"items": "xy/1 - user_1"
}
]
},
{
"file": "file: file_2",
"items": [
{
"items": "xy/2 - na"
}
]
}
]
}
]
还需要显示每个级别的子级数量,因此输出应该如下所示:
[
{
"_id": "date: 2022-09-27 - 2",
"items": [
{
"file": "file: file_1 - 1",
"items": [
{
"items": "xy/1 - user_1"
}
]
},
{
"file": "file: file_2 - 1",
"items": [
{
"items": "xy/2 - na"
}
]
}
]
}
]
我不知道如何解决它。我尝试使用$set
运算符,但不能在其中使用group。这是一个示例操场
您可以使用$map
在items数组上循环,并在file
中追加子项的数量,如下所示:
db.collection.aggregate([
{
$set: {
"username": {
$filter: {
input: "$userList",
as: "user",
cond: {
"$eq": [
"$$user.boolId",
1
]
}
}
}
}
},
{
$set: {
"username": {
$arrayElemAt: [
"$username",
0
]
}
}
},
{
$set: {
"username": {
$ifNull: [
"$username.userName",
"na"
]
}
}
},
{
$group: {
_id: {
"date": {
$concat: [
"date: ",
"$date",
]
},
"file": {
$concat: [
"file: ",
"$file"
]
},
},
"items": {
$push: {
"items": {
$concat: [
"$packagecode",
" - ",
"$username"
]
}
}
}
}
},
{
$group: {
_id: "$_id.date",
"items": {
$push: {
"file": "$_id.file",
"items": "$items"
}
}
}
},
{
"$set": {
"items": {
"$map": {
"input": "$items",
"as": "element",
"in": {
items: "$$element.items",
file: {
"$concat": [
"$$element.file",
" - ",
{
"$toString": {
"$size": "$$element.items"
}
}
]
}
}
}
},
_id: {
"$concat": [
"$_id",
" - ",
{
"$toString": {
"$sum": {
"$map": {
"input": "$items",
"as": "element",
"in": {
"$size": "$$element.items"
}
}
}
}
}
]
}
}
}
])
游乐场链接。