2016-05-31 4 views
-1

Ich versuche, ein Feld in einer Sammlung mit Daten aus der gleichen Sammlung, aber von einem Sub-Sub-Feld darin zu aktualisieren, und beide können nicht die Syntax richtig, oder ich mache es nur falsch.Mongodb: Aktualisiere ein Feld mit Daten aus einem Sub-Sub-Feld?

Ich habe schon einige Zeit damit verbracht, hier herum zu graben, aber ich komme nirgendwohin.

Hier ist das Beispiel für die Struktur der Sammlung Benutzer:

{ 
    "_id": "12345qwerty", 
    "services": { 
    "oauth": { 
     "CharacterID": 12345678, 
     "CharacterName": "Official Username", 
    }, 
    }, 
    "name": "what I want to change", 
    "username": "OfficialUsername" 
} 

Was ich versuche mit SQL ziemlich trivial zu tun wäre, das heißt: alle Anzeigenamen aktualisieren, um eine vertrauenswürdige Quelle entsprechen ...

update users 
set name = services.oauth.CharacterName; 

... aber ich habe Probleme, MongoDB zu bekommen, und ich habe das Gefühl, ich mache es falsch.

Hier ist, was ich bisher habe, aber es funktioniert nicht wie erwartet.

db.users.find().snapshot().forEach(
    function (elem) { 
    db.users.update(
     { _id: elem._id }, 
     { $set: { name: elem.services.oauth.CharacterName } } 
    ); 
    } 
); 

kann ich den Namen gesetzt etwas an der Basis-Ebene zu sein, aber nicht einstellen kann es etwas von der sublevel sein, da sie nicht die Unterfelder nicht erkennt.

Jede Hilfe würde sehr geschätzt werden!

+1

Konnte es fehlschlagen für einige Benutzer haben keine notwendigen Daten und mit 'elem.services.oauth.CharacterName' erwarten Sie alles an seinem Platz? – malarzm

Antwort

-1
db.users.update({"services.oauth.CharacterName": {$exists: true}},{$set: {"name": "services.oauth.CharacterName"}},{multi:true}) 

I Namen an der Wurzel des Dokuments setze auf den Wert in services.oauth.CharacterName im Sub Unter Dokument gleich sein. multi = true aktualisiert mehrere Dokumente, ich aktualisiere nur Dokumente mit dem Wert services.oauth.CharacterName.

Verwandte Themen