2016-04-08 12 views
0

Ich habe eine Datenbank mit Playerdaten, die einige bereits vorhandene Felder aus früheren Versionen des Programms enthält. Beispiel veraltetes Dokument:Aktualisieren von bereits vorhandenen Dokumenten im mongoDB java-Treiber, wenn Sie die Dokumentstruktur geändert haben

{ 
    "playername": "foo" 
} 

sondern ein Dokument Spieler unter der neuen Version erzeugt würde wie folgt aussehen:

{ 
    "playername": "bar", 
    "playercurrency": 20 
} 

das Problem ist, dass, wenn ich versuche, playercurrency auf foo abfragen erhalte ich eine Nullpointer weil playercurrency nicht existiert für foo. Ich möchte das Feld playercurrency zu foo hinzufügen, ohne andere Daten zu stören, die in foo gespeichert werden könnten. Ich habe einige Code $exists Beispiel versucht:

players.updateOne(new Document("playername", "foo"), new Document("$exists", new Document("playername", ""))); 
players.updateOne(new Document("playername", "foo"), new Document("$exists", new Document("playercurrency", 20))); 

Mein Gedanke ist, dass es nur playercurrency aktualisiert, weil es nicht existiert, und es wäre playername allein lassen becuase es existiert. Ich benutze möglicherweise schrecklich falsch, und wenn ja, lass es mich wissen, weil dies eines meiner ersten MongoDB-Projekte ist und ich gerne so viel wie möglich lernen würde.

+0

Sind bereits vorhandene Felder wie folgt: [{"Spielername": "foo"}, {"Spielername": "Bar"}, {"Spielername": "Teer"}]. Fragen Sie einfach ... –

+0

Ich verstehe Ihre Frage nicht ... Ich denke, um 'foo' und' bar' zu klären sind ihre eigenen Dokumente, jedes hat andere Felder, weil eines auf einer alten Version generiert wurde und das andere generiert wurde auf der neueren Version. –

Antwort

0

So weiß ich, dass es in der Regel auf Ihre eigene Frage zu beantworten verpönt, aber niemand wirklich geschrieben, was ich mich am Ende tun wou Ich möchte diese Zeit nehmen, um @Mark Watson für die Beantwortung zu danken und schließlich mich zu führen, meine Antwort zu finden.

Da die Überprüfung, ob ein bestimmtes Feld null im MongoDB Java Treiber nicht funktioniert, musste ich einen anderen Weg finden, um zu wissen, wann etwas für ein Update vorbereitet ist. So nach einem wenig Forschung stieß ich auf this question, die ich mit diesem Code komme geholfen:

private static void updateValue(final String name, final Object defaultValue, final UUID key) { 
     if (!exists(name, key)) { 
      FindIterable iterable = players.find(new Document("_id", key)); 

      iterable.forEach(new Block<Document>() { 

       @Override 
       public void apply(Document document) { 
        players.updateOne(new Document("_id", key), new Document("$set", new Document(name, defaultValue))); 
       } 
      }); 
     } 
    } 

    private static boolean exists(String name, UUID key) { 
     Document query = new Document(name, new Document("$exists", true)).append("_id", key); 

     return players.count(query) == 1; 
    } 

Natürlich ist dies etwas spezialisiert auf dem, was ich tun wollte, aber mit wenig Änderungen kann es leicht erlaufen geändert werden, um arbeite mit allem, was du brauchst. Stellen Sie sicher, dass Sie players durch Ihr Collection-Objekt ersetzen.

0

Müssen Sie dies mit Java tun? Immer wenn ich ein neues Feld hinzufüge, das ich benötigt, verwende ich einfach die Befehlszeile, um alle vorhandenen Dokumente zu migrieren. Diese Schleife wird durch alle Spieler, die es auf 0 (zu ändern, was auch immer Sie wollen Standard) eingestellt keine playercurrency haben und:

db.players.find({playercurrency:null}).forEach(function(player) { player.playercurrency = 0; // or whatever default value db.players.save(player); });

Dies führt in die folgenden Dokumente mit:

{ "playername" : "foo", "playercurrency" : 0 }

{ "playername" : "bar", "playercurrency" : 20 }

+0

Ich werde mich definitiv darum kümmern, danke für die Antwort! –

Verwandte Themen