gpt4 book ai didi

mongodb - 在 MongoDB 中展平嵌套对象并重命名

转载 作者:行者123 更新时间:2023-12-04 23:42:50 25 4
gpt4 key购买 nike

假设我有这样的文件

{
"id" : "1415166669",
"color" : {
"14" : "Silver"
},
"name":"Random Name"
}

里面的关键颜色可以改变,即下一个文档可能看起来像这样
{
"id" : "1415126969",
"color" : {
"11" : "Gold"
},
"name":"Random Name 2"
}

我想展平并重命名它们,以便我的文档具有如下类似的结构:
{
"id" : "1415126969",
"color" : "Gold"
"name":"Random Name 2"
}


{
"id" : "1415166669",
"color" : "Silver"
"name":"Random Name"
}

我尝试使用聚合管道,但我不确定如何进一步进行。
任何人都可以建议使用 Robomongo 的方法,那也很好。

最佳答案

我会为此运行一个简单的 JavaScript 循环,因为它会非常快速且易于编码。它也可以应用于同一个集合:

var ops = [];

db.collection.find().forEach(function(doc) {
let color;
Object.keys(doc.color).forEach(function(key) {
color = doc.color[key];
});
ops = [
...ops,
{ "updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "color": color } }
}}
];
if ( ops.length >= 500 ) {
db.collection.bulkWrite(ops);
ops = [];
}
})

if ( ops.length > 0 ) {
db.collection.bulkWrite(ops);
ops = [];
}

所以你基本上遍历对象的“键”并获取值,稍后我们用 $set 写回文档。

或者,从 MongoDB 3.4 开始,您可以使用 $objectToArray 运行聚合语句。以访问 key 。但是你真的只应该在集合有数百万个文档的地方这样做。 $out 的要求意味着结果在新集合中,而不是当前正在更新的集合中:
db.collecion.aggregate([
{ "$addFields": {
"color": {
"$arrayElemAt": [
{ "$map": {
"input": { "$objectToArray": "$color" },
"as": "c",
"in": "$$c.v"
}},
0
]
}
}},
{ "$out": "newcollection" }
])

这是有效的,因为 $objectToArray把你的结构变成这样:
"color": { "11": "Gold" }

进入这个:
"color": [{ "k": "11", "v": "Gold" }]

所以我们可以使用 $map 运算符以提取 "color.v"路径值和 $arrayElemAt 将其转换为奇异值而不是数组。

一般来说,对于聚合管道语句来说,这种转换要比简单地通过操作代码中的文档结构然后写回目标集合来实现的转换复杂得多。

鉴于现有文件:
{
"_id" : ObjectId("59389951fc04695e84e7f4ae"),
"id" : "1415166669",
"color" : {
"14" : "Silver"
},
"name" : "Random Name"
}
{
"_id" : ObjectId("59389a75fc04695e84e7f4af"),
"id" : "1415126969",
"color" : {
"11" : "Gold"
},
"name" : "Random Name 2"
}

两种方法的输出是:
{
"_id" : ObjectId("59389951fc04695e84e7f4ae"),
"id" : "1415166669",
"color" : "Silver",
"name" : "Random Name"
}
{
"_id" : ObjectId("59389a75fc04695e84e7f4af"),
"id" : "1415126969",
"color" : "Gold",
"name" : "Random Name 2"
}

关于mongodb - 在 MongoDB 中展平嵌套对象并重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44410777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com