首页 > 解决方案 > 在 MongoDB 集合中重命名数组中的属性

问题描述

我想重命名我们的一个 MongoDB 集合中的一个属性,因为它在应该是单数的地方是复数的。但是,当我在 Mongo shell 中尝试这个时:

db.getCollection("customers").updateMany( { _id: {$exists: true} }, { $rename: { "billingOptions.0.paymentCards": "billingOptions.0.paymentCard" } } )

...我得到这个“不能是数组元素”错误:

"errmsg" : "源字段不能是数组元素,'billingOptions.0.paymentCards' 在 _id 的文档中:ObjectId('3d12fefc093r76146ccf50g8') 有一个名为 'billingOptions' 的数组字段"

不知道为什么这会是一个问题,因为我准确地告诉它要定位哪个数组元素。但是,无论哪种方式,在这种情况下,我可以使用什么操作来重命名此属性

以下是文档相关部分的示例:

"billingOptions" : [
    {
        "method" : "private", 
        "paymentCards": {
            "deleted" : false,
            // other props
        }
    }, 
]

这就是我希望它看起来的样子:

"billingOptions" : [
    {
        "method" : "private", 
        "paymentCard": {
            "deleted" : false,
            // other props
        }
    }, 
]

请注意,“billingOptions”是文档根目录上的一个属性。我想做的就是将“paymentCards”的所有实例重命名为“paymentCard”,因为它在这里是一个单一的对象,而不是一个数组。

标签: mongodb

解决方案


您需要$out来替换现有的集合和$addFields$map来替换每个文档中的现有数组

db.customers.aggregate([
    {
        $addFields: {
            billingOptions: {
                $map: {
                    input: "$billingOptions",
                    in: {
                        method: "$$this.method",
                        // other fields
                        paymentCard: "$$this.paymentCards"
                    }
                }
            }
        }
    },
    {
        $out: "$customers"
    }
])

推荐阅读