mongodb - 在 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”,因为它在这里是一个单一的对象,而不是一个数组。
解决方案
您需要$out来替换现有的集合和$addFields用$map来替换每个文档中的现有数组
db.customers.aggregate([
{
$addFields: {
billingOptions: {
$map: {
input: "$billingOptions",
in: {
method: "$$this.method",
// other fields
paymentCard: "$$this.paymentCards"
}
}
}
}
},
{
$out: "$customers"
}
])
推荐阅读
- redux - redux js工具包商店没有更新
- ftp - 同一文件夹中的两个图像可以具有相同的文件名但不同的元数据吗?
- unity3d - 如何使 XR 射线交互器面向不同的方向
- snowflake-cloud-data-platform - Snowflake: JSON data with dynamic columns
- javascript - 使用javascript按特定顺序排序
- c++ - 可以通过 QVTKOpenGLNativeWidget 与 vtkActor 交互吗?
- flutter - Flutter 中的 Base64 字符串 HTTP Post
- css - 溢出和高度禁用 Safari 上的平滑滚动
- c# - 如何使用 Roslyn 运行使用 nuget 包的脚本?
- c# - 为 C# 结构内的数组分配缓冲区的更好解决方案?