在Mongo中,如何在聚合操作中重命名一个新添加的字段?

huangapple go评论144阅读模式
英文:

In Mongo how do I rename a new added field in an aggregation?

问题

当执行聚合操作时,我要添加一个新字段,该字段包含另一个对象的数据,但在最后一步,我想将该字段重命名为其他名称(原始对象我获取数据的对象)。在这种情况下,您可以使用什么操作符,当然,$replace 在这种情况下不起作用。

{
    $match: { _id: id },
},
{
    $addFields: {
        'userMetadata.active': '$user.active',
        'userMetadata.metadata': '$user.metadata',
    },
},
{ $unset: 'user' }
//这里我想将userMetadata替换为user

谢谢!

基本上,我正在寻找一个替代方案来添加以下内容:

{
    $addFields: {
        user: '$userMetadata',
    },
},
{ $unset: 'userMetadata' },

这个解决方案有效,但我不确定在处理长列表时性能如何。

更新 2:
这似乎有效,但比我想要的步骤更多:

{
    $addFields: {
        'userMeta.active': '$user.active',
        'userMeta.metadata.name': '$user.metadata.name',
        'userMeta.metadata.url': '$user.metadata.url',
        user: '$$REMOVE',
    },
},
{
    $addFields: {
        user: '$userMeta',
        userMeta: '$$REMOVE',
    },
}
英文:

When doing an aggregation I add a new field that has data from another object but in the last step I want to rename the field to something else(the original object I am getting data from)

What operator can I use to do that, of course, $replace doesn't work in this case

{
    $match: { _id: id },
},
{
    $addFields: {
        'userMetadata.active': '$user.active',
        'userMetadata.metadata': '$user.metadata',
    },
},
{ $unset: 'user' }
//Here I want to replace userMetadata with user

Thank you

Basically, I am looking for an alternative to adding this

{
    $addFields: {
       user: '$userMetadata',
    },
},
{ $unset: 'userMetadata' },

This solution works but I am not sure how performant it is over long lists

Update 2:
This seems to work, still more stages than I want

{
    $addFields: {
        'userMeta.active': '$user.active',
        'userMeta.metadata.name': '$user.metadata.name',
        'userMeta.metadata.url': '$user.metadata.url',
        user: '$$REMOVE',
    },
},
{
    $addFields: {
        user: '$userMeta',
        userMeta: '$$REMOVE',
    },
},

答案1

得分: 0

{
$addFields: {
'user': '$userMetadata',
'userMetadata': '$$REMOVE'
}
}

$unset 也接受一个数组:

{ $unset: [ 'user', '', ... ] }

或者使用 $project,它会移除除了 _id 之外未在列表中的所有字段:

{
$project: {
'user': '$userMetadata',
'_id': 0
}
}

英文:

You can use this:

{
    $addFields: {
        'user': '$userMetadata',
        'userMetadata': '$$REMOVE'
    }
}

$unset also accepts an array:

{ $unset: [ 'user', '<more fields>', ... ] }

Or use $project, it removes all (apart from _id) fields which are not listed:

{
    $project: {
        'user': '$userMetadata',
        '_id': 0
    }
}

huangapple
  • 本文由 发表于 2023年3月23日 08:12:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/75818275.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定