我是mongodb的新手。我可否知道如何避免重複輸入。在關係表中,我們使用主鍵來避免它。我可以知道如何使用java在Mongodb中指定它嗎?Mongodb避免重複條目
23
A
回答
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
我不是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
席恩解決方案並沒有爲我工作,但此人做:
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"));
}
}
相關問題
- 1. SQLite避免重複條目
- 2. 避免重複條目
- 3. 如何避免在插入到MongoDB時重複條目
- 4. 如何避免Mongodb中的重複對象條目?
- 5. 在NHibernate中避免重複的條目
- 6. Lucene 6如何避免重複條目
- 7. 想避免ArrayList中的重複條目
- 8. SQL Server中鎖 - 避免重複條目
- 9. MySQL查詢 - 避免重複條目
- 10. 避免重複
- 11. 避免重複
- 12. Mongodb查詢,避免重複項目與不同_id
- 13. javascript/jquery - 避免重複評估條件
- 14. 避免重複行
- 15. 避免重複值
- 16. R:避免重複$
- 17. 避免重複行
- 18. 避免Haskell中的重複項目
- 19. 如何避免重複樣式項目?
- 20. 避免重複列表項目
- 21. 如何避免這個「重複條目的密鑰」
- 22. 避免重複條目,而不是關鍵字段
- 23. 如何在嵌套迭代中避免重複條目
- 24. 如何避免重複的背景條目
- 25. 使用rails3-jquery-autocomplete來避免重複條目?
- 26. 避免在iOS中的UITableView重複條目
- 27. 避免Mongoose數組上的重複條目
- 28. 避免通過特定腳本創建重複的CRON條目
- 29. 維基百科如何避免重複條目?
- 30. 避免重複條目使用索引項
注意:'null'和none existant也算作唯一值,所以如果你有一個用戶的一些表刪除和法律你刪除他們的數據,但保留他們的行以供將來刪除,你將有獨特索引的問題。我想這是真的需要。 – Sammaye
@Sammaye:您可以使用[稀疏索引](http://www.mongodb.org/display/DOCS/Indexes#Indexes-sparse%3Atrue)來解決空/缺失字段的問題。 – Stennie
+1在這裏的文檔中提到了唯一索引的最後一段:http://docs.mongodb.org/manual/core/indexes/#unique-index – theon