2012-08-30 177 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的索引可以選擇徵收唯一鍵約束,這保證了沒有文檔插入其值的索引鍵匹配現有的文件。

如果您希望從唯一的密鑰被忽略null值,那麼你必須也賺了指數稀疏(here),也通過添加了sparse選項:

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

如果您想使用MongoDB Java驅動程序創建索引。嘗試:

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在這裏的文檔中提到了唯一索引的最後一段:http://docs.mongodb.org/manual/core/indexes/#unique-index – theon

0

我不是Java程序員,但是您可以將其轉換。

MongoDB的默認確實有被稱爲_id可以使用upsert()save()這個鍵,以防止文件被寫入兩次,像這樣一個主鍵:

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 

這將立即停止複製。至於在某些條件下多線程安全插入:好的,在這種情況下,我們需要更多地瞭解您的狀況。

但是我應該補充一點,_id的索引默認是unqiue。

+0

爲什麼downvote? – Sammaye

+0

Typo,看起來...... – Sammaye

0

席恩解決方案並沒有爲我工作,但此人做:

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

這可以用「_id」字段雖然這不鼓勵使用來完成。 假設您希望名稱是唯一的,那麼您可以將名稱放在「_id」列中,並且您可能知道「_id」列對每個條目都是唯一的。

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

現在,在集合中沒有其他條目可以具有名稱作爲「amit」。這可以是您要求的方式之一。

1

由於蒙戈的3.0版Java驅動程序的,創建索引的代碼如下所示:

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