0

私はアプリケーションの重大なバグを追跡しており、掘り下げた後、この例に分解しました。ジャクソン コレクションを使用して、ドキュメントを削除できません。通常、挿入したばかりの単一のドキュメントに対して機能します。次の例では、ユニットテスト コレクションを削除しようとしています。

import java.net.UnknownHostException;

import net.vz.mongodb.jackson.DBCursor;
import net.vz.mongodb.jackson.JacksonDBCollection;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.test.model.Account;

public class MongoTest {

  public static void main(String[] args) {
    try {
        Mongo mongo = new Mongo("localhost", 27017);
        DB db = mongo.getDB("orion-unittest");

        // get a single collection
        DBCollection collection = db.getCollection("account");
        JacksonDBCollection<Account, String> jacksonCollection = JacksonDBCollection.wrap(collection, Account.class, String.class);

        // doesn't work
        DBCursor<Account> jacksonCursor = jacksonCollection.find();
        while (jacksonCursor.hasNext()) {
            jacksonCollection.remove(jacksonCursor.next());
        }
        System.out.println(jacksonCollection.getCount());

        // works!
        com.mongodb.DBCursor cursor = collection.find();
        while (cursor.hasNext()) {
            collection.remove(cursor.next());
        }
        System.out.println(collection.getCount());

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (MongoException e) {
        e.printStackTrace();
    }
  }

}

コンソール出力:
6
0

奇妙な点は、mongo サーバーのアクティビティを監視すると、削除コマンドが渡されていることがわかります。私は何かを見逃していますか、それともこれはジャクソンマッパーのバグですか?

ここに Account クラスがあります - そこには何もありません。id は _id キーで埋められます:

import net.vz.mongodb.jackson.Id;

public class Account {
    @Id
    String id;
    String nickname = null;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}
4

2 に答える 2

0

@Id の代わりに @ObjectId を使用して解決策を見つけました。問題は、私のIDがシリアル化される前に

{"_id": ObjectId("4f7551a74206b4f8e692bda3")} 

次のようなものではありません:

{"_id": "4f7551a74206b4f8e692bda3"} 

...これは、一致するオブジェクトを見つけようとして remove によって実行されたクエリに失敗しました。@ObjectId アノテーションは、シリアル化の結果と等しくなりました。

于 2012-04-03T20:43:10.297 に答える
0

私はmongo-jackson-mapperを使用していませんが、ソースコードdbCollection.removeで見たように、メソッド自体のみを呼び出します。したがって、あなたの問題はWriteConcernにあると思います。これを試してください:

jacksonCollection.remove(jacksonCursor.next(), WriteConcern.FSYNC_SAFE);

そして2つの削除を別々に(次々にではなく)テストするので、削除するかどうかを本当に理解できます(削除ラグもある可能性があります)。

于 2012-04-03T06:56:55.597 に答える