2012-08-30 181 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")); 
    } 
}