MongoDB - 在地图中使用地图聚合
MongoDB - aggregation using map within map
是否可以在对象数组中映射一个数组?
我目前有这个 addFields 管道阶段,有问题的代码是 $setUnion 聚合器的第二个数组元素。它目前 returns 我需要的值所在的数组,所以我最终得到一个 'users' 由数组组成的数组(来自第二个映射阶段),然后是其他项目的字符串值在 setUnion 数组代码中,但我只需要嵌套数组中的所有字符串值。
当前添加字段后的文档示例输出:
{
_id: '6291f69f811b414175d11b16',
savesOnComment: [],
comments: [{
_id: '6297aa1112c9fe003a32ddeb',
owner: '61152b692816b44ff246e07b',
contentId: '6291f69f811b414175d11b16',
replyId: null,
saves: ['61152b692816b44ff246e07b']
}, {
_id: '6297aa1512c9fe003a32dded',
owner: '61152b692816b44ff246e07b',
contentId: '6291f69f811b414175d11b16',
replyId: null,
saves: ['61152b692816b44ff246e07b']
}],
users: [
['61152b692816b44ff246e07b'],
'61152b692816b44ff246e07b',
]
}
addFields 管道阶段:
{
'users': {
'$setUnion': [{
'$map': {
'input': '$comments',
'as': 'each',
'in': '$$each.owner'
}
}, {
'$map': {
'input': '$comments',
'as': 'each',
'in': {
'$map': {
'input': '$$each.saves',
'as': 'save',
'in': '$$save'
}
}
}
},
'$savesOnComment']
}
}
有很多方法可以做到这一点。这是使用 "$reduce"
“提取”"comments.saves"
内容的一种方法,本质上是将其展平,以便 "$setUnion"
提供您想要的输出。
db.collection.aggregate([
{
"$set": {
"users": {
"$setUnion": [
"$savesOnComment",
"$comments.owner",
{
"$reduce": {
"input": "$comments.saves",
"initialValue": [],
"in": {
"$concatArrays": [ "$$value", "$$this" ]
}
}
}
]
}
}
}
])
在 mongoplayground.net 上试用。
是否可以在对象数组中映射一个数组?
我目前有这个 addFields 管道阶段,有问题的代码是 $setUnion 聚合器的第二个数组元素。它目前 returns 我需要的值所在的数组,所以我最终得到一个 'users' 由数组组成的数组(来自第二个映射阶段),然后是其他项目的字符串值在 setUnion 数组代码中,但我只需要嵌套数组中的所有字符串值。
当前添加字段后的文档示例输出:
{
_id: '6291f69f811b414175d11b16',
savesOnComment: [],
comments: [{
_id: '6297aa1112c9fe003a32ddeb',
owner: '61152b692816b44ff246e07b',
contentId: '6291f69f811b414175d11b16',
replyId: null,
saves: ['61152b692816b44ff246e07b']
}, {
_id: '6297aa1512c9fe003a32dded',
owner: '61152b692816b44ff246e07b',
contentId: '6291f69f811b414175d11b16',
replyId: null,
saves: ['61152b692816b44ff246e07b']
}],
users: [
['61152b692816b44ff246e07b'],
'61152b692816b44ff246e07b',
]
}
addFields 管道阶段:
{
'users': {
'$setUnion': [{
'$map': {
'input': '$comments',
'as': 'each',
'in': '$$each.owner'
}
}, {
'$map': {
'input': '$comments',
'as': 'each',
'in': {
'$map': {
'input': '$$each.saves',
'as': 'save',
'in': '$$save'
}
}
}
},
'$savesOnComment']
}
}
有很多方法可以做到这一点。这是使用 "$reduce"
“提取”"comments.saves"
内容的一种方法,本质上是将其展平,以便 "$setUnion"
提供您想要的输出。
db.collection.aggregate([
{
"$set": {
"users": {
"$setUnion": [
"$savesOnComment",
"$comments.owner",
{
"$reduce": {
"input": "$comments.saves",
"initialValue": [],
"in": {
"$concatArrays": [ "$$value", "$$this" ]
}
}
}
]
}
}
}
])
在 mongoplayground.net 上试用。