Mongodb避免重复输入

时间:2012-08-30 06:47:32

标签: java mongodb mongodb-java

我是mongodb的新手。我可以知道如何避免重复输入。在关系表中,我们使用主键来避免它。我可以知道如何使用java在Mongodb中指定它吗?

6 个答案:

答案 0 :(得分:41)

使用带{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));

答案 1 :(得分:1)

这可以使用" _id"尽管不鼓励这种用途。 假设您希望名称是唯一的,那么您可以将名称放在" _id"列,你可能知道" _id"列对于每个条目都是唯一的。

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

现在,没有其他条目可以命名为" amit"在集合中。这可能是你要求的方式之一。

答案 2 :(得分:1)

从Mongo的v3.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"));
    }
}

答案 3 :(得分: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。

答案 4 :(得分:0)

Theon解决方案对我不起作用,但是这个解决了:

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

答案 5 :(得分:0)

使用pymongo看起来像:

mycol.create_index("id", unique=True)

其中myCol是数据库中的集合

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mycol.create_index("id", unique=True)
mydict = {"name": "xoce", "address": "Highway to hell 666", "id": 1}
x = mycol.insert_one(mydict)