【问题标题】:Renaming Property Within Array in MongoDB Collection在 MongoDB 集合中重命名数组中的属性
【发布时间】:2019-05-07 14:57:57
【问题描述】:

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

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

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

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

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

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

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

这就是我想要的样子:

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

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

【问题讨论】:

  • 您想仅从第一个 billingOption(索引 0)还是从所有这些重命名 paymentCards?您能否分享一个示例文档和预期的更新文档?
  • 理想情况下,我会做所有这些,而不仅仅是第一个数组元素。
  • 我在上面添加了文档结构。

标签: mongodb


【解决方案1】:

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

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

【讨论】:

  • 啊,好的。而且我需要在“billingOption”(例如“method”)中明确包含所有道具,否则这些道具将被清除,对吗?
  • @Muirik 是的,这是最简单的方法
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多