0

私はMongoDBの初心者です。Morphia を使用して Java からアクセスしています。私はこれに沿って何かをする必要があります:

public boolean isUnique(short s){
//操作 1: フィールド "id" = s を持つオブジェクトが存在するかどうか mongo をチェックします//存在する
場合は false を返します
//そうでなければ、
//操作 2: データベースにこのオブジェクトを作成します
//そしてtrueを返します
}

私が理解しなければならない問題は、実際の構文ではなく、原子性の問題です。OP1 と OP2 がアトミックになるように、1 つのスレッド/プロセスだけがドキュメントにアクセスできるようにするにはどうすればよいですか? Java サーバーはクラスター化された環境にあるため、これはデータベース レベルで管理する必要があると思います。

よろしく、 アンダース

4

2 に答える 2

1

両方の操作を {id: s} ドキュメントの 1 つのupsertに置き換えることができます。これは、ドキュメントが既に存在する場合はノーオペレーションになりますが、存在しない場合は挿入になります。コマンドを呼び出すとgetLastError(ドライバーがこれを実行できます)、新しいドキュメントが作成されたかどうかがわかります。

于 2012-09-17T13:21:22.363 に答える
1

私は Java と Morphia を使用しているので、実際のコードは次のようになります。将来、同じことを実現したいと考えている人がいる場合。これは、アップサートであることを Mongo に伝えるtrueための呼び出しです。updateFirst

public boolean checkIfExistsAndInsertOtherwise(short id){
    Datastore datastore = getDatastore();
    Query<OrganizationId> updateQuery = datastore.createQuery(OrganizationId.class).field("identificationNumber").equal(id);

    //Bogus operation, just set id to itself
    UpdateOperations<OrganizationId> ops = datastore.createUpdateOperations(OrganizationId.class).set("identificationNumber", id);

    UpdateResults<OrganizationId> result = datastore.updateFirst(updateQuery, ops, true,WriteConcern.SAFE);

    return result.getInsertedCount() == 0;
  }
于 2012-09-19T12:49:58.910 に答える