我是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