这是我在长时间聚合后得到的数组。
"stages": [
[
{
"id": "58a6678bc27c331884b60930",
"description": "Lorem ipsum dolor sit amet...",
"somevalue": 0,
"user": "589cf6511b94281f34617a13"
},
{
"_id": "589cf6511b94281f34617a13",
"title": "Dr.",
"firstname": "Doe",
"lastname": "John"
}
]
]
如您所见,现在我有一堆彼此嵌套的数组。有没有办法统一数组中的两个集合或给它们正确的索引名称?
可能的解决方案#1就是这个。内部阵列消失了,这些集合也是统一的。
"stages": [
{
"id": "58a6678bc27c331884b60930",
"description": "Lorem ipsum dolor sit amet...",
"somevalue": 0,
"user": "589cf6511b94281f34617a13"
"_id": "589cf6511b94281f34617a13",
"title": "Dr.",
"firstname": "Doe",
"lastname": "John"
}
]
可能的解决方案#2:数组没有消失,但至少元素现在有索引名称,我不必将它们称为[0]和[1]。
"stages": [
[
"stage": {
"id": "58a6678bc27c331884b60930",
"description": "Lorem ipsum dolor sit amet...",
"somevalue": 0,
"user": "589cf6511b94281f34617a13"
},
"user": {
"_id": "589cf6511b94281f34617a13",
"title": "Dr.",
"firstname": "Doe",
"lastname": "John"
}
]
]
任何有解决方案的人都可以使用虚拟Cookie ...
汇总代码
db.collection('bugs').aggregate([{
$match: new ObjectId()
}, {
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'userdata'
}
},
{
$unwind: '$userdata'
},
{
$sort: {
'stages.date': -1
}
},
{
$unwind: '$stages'
}, {
$lookup: {
from: 'users',
localField: 'stages.user',
foreignField: '_id',
as: 'stages_users'
}
},
{
$unwind: '$stages_users'
}, {
$unwind: '$stages'
},
{
$group: {
'_id': '$_id',
'title': {
$first: '$title'
},
'user': {
$first: '$user'
},
'browser': {
$first: '$browser'
},
'severity': {
$first: '$severity'
},
'data': {
$first: '$data'
},
'userdata': {
$first: '$userdata'
},
'stages': {
$addToSet: {
$setUnion: [
['$stages_users'],
['$stages']
]
}
}
}
},
{
$project: {
'_id': 1,
'user': 1,
'title': 1,
'browser': 1,
'date': 1,
'severity': 1,
'userdata._id': 1,
'userdata.title': 1,
'userdata.firstname': 1,
'userdata.lastname': 1,
'stages._id': 1,
'stages.id': 1,
'stages.user': 1,
'stages.date': 1,
'stages.description': 1,
'stages.severity': 1,
'stages.previous_severity': 1,
'stages.files': 1,
'stages.title': 1,
'stages.firstname': 1,
'stages.lastname': 1
}
}
],
答案 0 :(得分:1)
您可以尝试以下聚合。
因此,这里的想法是在stages
阶段stage_users
之后将stages_merge_users
和$lookup
中的字段合并到$project
文档中。
我已经从stages
和stage_users
添加了字段以进行演示。
您必须从两个文档中一次添加一个字段,最后一个阶段将$group
阶段重新添加到一起。
db.bugs.aggregate([{
$lookup: {
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'userdata'
}
}, {
$unwind: '$stages'
}, {
$lookup: {
from: 'users',
localField: 'stages.user',
foreignField: '_id',
as: 'stages_users'
}
}, {
$unwind: '$stages_users'
}, {
$project: {
'_id': 1,
'user': 1,
'title': 1,
'browser': 1,
'date': 1,
'severity': 1,
'userdata': 1,
"stages_merge_users.firstname": "$stages_users.firstname",
"stages_merge_users.user": "$stages.user"
}
}, {
$group: {
'_id': '$_id',
'title': {
$first: '$title'
},
'user': {
$first: '$user'
},
'browser': {
$first: '$browser'
},
'severity': {
$first: '$severity'
},
'data': {
$first: '$data'
},
'userdata': {
$first: '$userdata'
},
'stages': {
$push: '$stages_merge_users'
}
}
}])
版本3.4更新
您可以将$project
阶段替换为$addFields
。此阶段将字段添加到现有字段。
{$addFields: { "stages_merge_users.firstname":"$stages_users.firstname", "stages_merge_users.user_id":"$stages.user_id"}},