0

プログラムの以前のバージョンからのいくつかの既存のフィールドを持つプレーヤーデータのデータベースがあります。古いドキュメントの例:

{
   "playername": "foo"
}

しかし、新しいバージョンで生成されたプレーヤー ドキュメントは次のようになります。

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

問題は、クエリを実行しようとすると、playercurrencyが存在しないfooために NullPointerException が発生することです。に保存できる他のデータを邪魔することなく、フィールドをに追加したいと考えています。例を使用していくつかのコードを試しました:playercurrencyfooplayercurrencyfoofoo$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が存在しないという理由だけで更新され、存在するために放置されるというplayernameことです。これは私の最初の MongoDB プロジェクトの 1 つであり、できる限り多くのことを学びたいので、exists をひどく間違って使用している可能性があります。

4

2 に答える 2

0

したがって、通常、自分の質問に答えることに眉をひそめていることは知っていますが、私が最終的に何をしたかを実際に投稿した人は誰もいません。この時間を取って、@Mark Watsonに答えてくれて、最終的に私の答えを見つけるように導いてくれたことに感謝します。

特定のフィールドがnullMongoDB Java ドライバーで機能しないかどうかを確認するため、更新の準備ができていることを知る別の方法を見つける必要がありました。そのため、少し調査した後、このコードを思いつくのに役立つこの質問に出くわしました。

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

明らかに、これは私がやりたかったことに少し特化していますが、少し修正するだけで、必要なものに合わせて簡単に変更できます。players必ずCollection オブジェクトに置き換えてください。

于 2016-04-08T09:22:07.497 に答える