2012-08-30 40 views
23

私はmongodbに初心者です。重複するエントリを避ける方法を知っていてもいいですか?リレーショナル表では、主キーを使用してそれを回避します。 javaを使ってMongodbで指定する方法を知ってもいいですか?Mongodbは重複した記入を避ける

答えて

38

{unique:true}オプションのインデックスを使用してください。

// everyone's username must be unique: 
db.users.createIndex({email:1},{unique:true}); 

これを複数のフィールドにまたがって行うこともできます。 詳細と例については、this sectionを参照してください。

MongoDBのインデックスは、必要に応じて何の文書が、その値は、インデックス付きキーの既存の文書のものと一致して挿入されていないことを保証ユニークキー制約を課すことができます。

// everyone's username must be unique, 
//but there can be multiple users with no email field or a null email: 
db.users.createIndex({email:1},{unique:true, sparse:true}); 

null値が一意のキーから無視されるために必要であれば

、その後、あなたはまた、sparseオプションを追加することによって、また、まばらなインデックスを(hereを参照)を確認する必要がありますMongoDB Java Driverを使用して索引を作成する場合。試してみてください:

Document keys = new Document("email", 1); 
collection.createIndex(keys, new IndexOptions().unique(true)); 
+0

注: 'null'とnone existantも一意の値として扱われるので、削除されたユーザーのテーブルがあり、法律でデータを削除するが、将来の削除のために行を保持するユニークなインデックスの問題私はそれが本当に必要になると思う。 – Sammaye

+2

@Sammaye:あなたはナル/不足している分野で問題を解決するために、[スパースインデックス](http://www.mongodb.org/display/DOCS/Indexes#Indexes-sparse%3Atrue)を使用することができます。 – Stennie

+0

+1これは、ユニークなインデックスの最後の段落は、ここではドキュメントに記載されます。また、 – theon

0

私はJavaプログラマではありませんが、おそらくこれを変換することができます。

var doc = {'name': 'sam'}; 
db.users.insert(doc); // doc will get an _id assigned to it 
db.users.insert(doc); // Will fail since it already exists 

これはすぐに複製を停止します。デフォルトで

MongoDBは_idあなたがそうのように二回書き込まれた文書を防ぐために、このキーにupsert()またはsave()を使用することができますとして知られている主キーを持っています。特定の条件下でのマルチスレッドセーフインサートについては、この場合、あなたの状態についてもっと知る必要があります。

ただし、_idのインデックスはデフォルトでは一意ではありません。

+0

なぜdownvote? – Sammaye

+0

Typo、それはそうだ... – Sammaye

0

テオンソリューションは私のために動作しませんでしたが、これがやった:この使用は推奨されているが

BasicDBObject query = new BasicDBObject(<fieldname>, 1); 
collection.ensureIndex(query, <index_name>, true); 
1

は、これは「_id」フィールドを使用して行うことができます。 名前が一意になるようにするには、「_id」列に名前を入れることができます。「_id」列が各エントリごとに一意であることがわかるかもしれません。 collection.Thisで「アミットは、」あなたが求めている方法のいずれかになりますよう

BasicDBObject bdbo = new BasicDBObject("_id","amit"); 

さて、他のエントリには、名前を持つことはできません。モンゴのV3.0 Javaドライバのよう

1

、インデックスを作成するためのコードは次のようになります。

public void createUniqueIndex() { 
    Document index = new Document("fieldName", 1); 
    MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName"); 
    collection.createIndex(index, new IndexOptions().unique(true)); 
} 

// And test to verify it works as expected 
@Test 
public void testIndex() { 
    MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName"); 

    Document newDoc = new Document("fieldName", "duplicateValue"); 
    collection.insertOne(newDoc); 

    // this will throw a MongoWriteException 
    try { 
     collection.insertOne(newDoc); 
     fail("Should have thrown a mongo write exception due to duplicate key"); 
    } catch (MongoWriteException e) { 
     assertTrue(e.getMessage().contains("duplicate key")); 
    } 
} 
関連する問題