3

一意のインデックス制約のために失敗する必要がある単純なコードの一部があります。ただし、一意のインデックスにもかかわらず、両方のオブジェクトがデータベースに追加され、クエリを実行できます。

    BasicDBObject typeUrlIndex = new BasicDBObject();
    typeUrlIndex.put(FIELD_TYPE_URL, 1);

    BasicDBObject typeUrlIndexOptions = new BasicDBObject();
    typeUrlIndexOptions.put("background", true);
    typeUrlIndexOptions.put("sparse", true);
    typeUrlIndexOptions.put("unique", true);
    typeUrlIndexOptions.put("dropDups", true);

    objects.ensureIndex(typeUrlIndex, typeUrlIndexOptions);

    // here I can check, that index is really created, and it is true.
    List<DBObject> indexes = objects.getIndexInfo();

    BasicDBObject dbo1 = new BasicDBObject(FIELD_TYPE_URL, "aaa");
    objects.save(dbo1);

    BasicDBObject dbo2 = new BasicDBObject(FIELD_TYPE_URL, "aaa");
    objects.save(dbo2);

両方のオブジェクトが保存され、異なる _id が取得されます。

更新。 わかった、どうした。両方のオブジェクトは、データベースに保存した後に独自の ID を取得しますが、実際には 2 番目のオブジェクトは保存されません (指定された ID であってもクエリできません)。

正しい答えを与えてくれたaraqnidのおかげです。残念ながら、投票するのに十分な評価がありません。

4

2 に答える 2

7

新しいセッションを見ると、両方のオブジェクトが表示されていますか? 保存が安全でない場合、サーバーが実際には 2 番目の保存を拒否しても、上記のコードで割り当てられた ID が返される可能性があります。

于 2012-01-10T17:14:08.247 に答える
0

{ unique: true }インデックスを作成するときにオプションを追加する必要があります

mongodb の一意のインデックスのドキュメント

于 2012-01-10T16:01:07.140 に答える