würde ich eine einfache JavaScript-Schleife für diese laufen, da es ganz schnell und einfach zu Code sein wird. Es kann auch auf die gleiche Sammlung angewendet werden:
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 = [];
}
So durchqueren Sie im Grunde die „Schlüssel“ des Objekts und den Wert erhalten, der später wir mit $set
Alternativ zu dem Dokument zurück schreiben, da MongoDB 3.4 Sie können eine Aggregationsanweisung mit $objectToArray
ausführen, um auf die Schlüssel zuzugreifen. Aber das sollten Sie nur tun, wenn die Sammlung Millionen von Dokumenten enthält. Die Anforderungen an $out
bedeutet das Ergebnis in neue Kollektion ist, und nicht die aktuelle aktualisiert:
db.collecion.aggregate([
{ "$addFields": {
"color": {
"$arrayElemAt": [
{ "$map": {
"input": { "$objectToArray": "$color" },
"as": "c",
"in": "$$c.v"
}},
0
]
}
}},
{ "$out": "newcollection" }
])
Das funktioniert, weil $objectToArray
macht Ihre Struktur wie folgt aus:
"color": { "11": "Gold" }
In diese:
"color": [{ "k": "11", "v": "Gold" }]
So können wir dann den Operator $map
verwenden, um den Pfadpfad "color.v"
undzu extrahieren, um dies in einen singulären Wert anstatt in ein Array zu verwandeln. Im Allgemeinen sind solche Konvertierungen für Aggregationspipeline-Anweisungen sehr viel komplexer als für das, was Sie einfach erreichen können, indem Sie die Dokumentstruktur im Code manipulieren und dann in die Zielsammlung zurückschreiben.
Angesichts der bestehenden Dokumente:
{
"_id" : ObjectId("59389951fc04695e84e7f4ae"),
"id" : "1415166669",
"color" : {
"14" : "Silver"
},
"name" : "Random Name"
}
{
"_id" : ObjectId("59389a75fc04695e84e7f4af"),
"id" : "1415126969",
"color" : {
"11" : "Gold"
},
"name" : "Random Name 2"
}
Ausgabe von beiden Methoden ist:
{
"_id" : ObjectId("59389951fc04695e84e7f4ae"),
"id" : "1415166669",
"color" : "Silver",
"name" : "Random Name"
}
{
"_id" : ObjectId("59389a75fc04695e84e7f4af"),
"id" : "1415126969",
"color" : "Gold",
"name" : "Random Name 2"
}
Wenn Sie die Werte in Ihrer Sammlung beabsichtigen, ändern, dann eine einfache Schleife in Code ist die bester Ansatz. Dies ist im Aggregation-Framework mit MongoDB 3.4 möglich, aber es ist auch viel komplexer als der Code, der in einer Schleife ausgeführt wird. Das gesamte Aggregations-Framework kann auch mit "$ out" in eine "neue" Sammlung schreiben. Sie sollten diese Methode also nur verwenden, wenn die Sammlung wirklich groß ist. –