2016-04-08 12 views
0

私は以前のバージョンのプログラムからの既存のフィールドを持つplayerdataのデータベースを持っています。時代遅れの例文書:文書構造を変更したときにmongoDB javaドライバの既存文書を更新する

{ 
    "playername": "foo" 
} 

が、新しいバージョンで生成されたプレーヤーの文書は次のようになります。

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

問題は、私がfooplayercurrencyを照会しようとした場合、私はNullPointerExceptionが取得するということですfooの場合はplayercurrencyが存在しないためです。 fooに保存できる他のデータを妨害することなく、playercurrencyフィールドをfooに追加したいと思います。私は$exists例を使用していくつかのコードを試してみた:

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))); 

私の考えは、それが存在しないので、それが唯一のplayercurrencyを更新し、それが存在するbecuaseそれだけではplayernameを残すだろうということです。私はひどく間違った存在をしているかもしれませんが、もしそうなら私に教えてください。これは私の最初のMongoDBプロジェクトの一つであり、できるだけ多くのことを学びたいと思っています。

+0

既存のフィールドは、{{"playername": "foo"}、{"playername": "bar"}、{"playername": "tar"}のようになります。ただ質問する... –

+0

私はあなたの質問を理解していない...私は 'foo'と' bar'を明らかにすると思いますが、それぞれ独自のドキュメントです。一つは古いバージョンで生成され、もう一つは生成されたためです新しいバージョンでは –

答えて

0

だから私は、それは通常、あなた自身の質問に答えるには眉をひそめていることを知っているが、誰も本当に私が私WOUをやってしまったものを掲載しません私は答えを見つけるために@Mark Watsonに感謝し、最終的に私を導くためにこの時間を取っています。

特定のフィールドがnullであるかどうかをチェックするのはMongoDB Java Driverでは機能しませんので、何かが更新の準備が完了したときを知るためには別の方法を見つける必要がありました。だから、研究の少し後に私は私がこのコードを考え出す助けthis questionつまずい:

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; 
    } 

明らかにこれは私がやりたいことにはほとんどの専門ですが、少し改正でそれはeasliyに変更することができますあなたが必要とするものと一緒に働きなさい。 playersをCollectionオブジェクトに置き換えてください。

0

これはjavaで行う必要がありますか?必要な新しいフィールドを追加するたびに、コマンドラインを使用して既存のすべてのドキュメントを移行するだけです。 (好きなデフォルトに変更)playercurrencyを持っており、0に設定していないすべてのプレイヤーによるこの意志ループは:

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

これは、次のドキュメントを持つになります{ "playername" : "foo", "playercurrency" : 0 }

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

+0

私は間違いなくそれを見て、応答ありがとう! –

関連する問題