Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mongodb避免重复条目_Java_Mongodb_Mongodb Java - Fatal编程技术网

Java Mongodb避免重复条目

Java Mongodb避免重复条目,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我是mongodb的新手。请告诉我如何避免重复输入。在关系表中,我们使用主键来避免它。我可以知道如何使用java在Mongodb中指定它吗?我不是java程序员,但是您可能可以转换它 默认情况下,MongoDB有一个名为\u id的主键。您可以在此键上使用upsert()或save(),以防止文档像这样被写入两次: var doc = {'name': 'sam'}; db.users.insert(doc); // doc will get an _id assigned to it db.u

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

我不是java程序员,但是您可能可以转换它

默认情况下,MongoDB有一个名为
\u 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
这将立即停止复制。对于特定条件下的多线程安全插入:那么,我们需要更多地了解您在这种情况下的情况


但是,我应该补充一点,
\u id
索引默认为unqiue。

使用带有
{unique:true}
选项的索引

// everyone's username must be unique:
db.users.createIndex({email:1},{unique:true});
您还可以跨多个字段执行此操作。有关更多详细信息和示例,请参见文档中的

唯一索引确保索引字段不存储重复值;i、 e.强制索引字段的唯一性。默认情况下,MongoDB在创建集合期间在_id字段上创建唯一索引

如果希望从唯一键忽略
null
值,则还必须通过添加
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));

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

BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);
BasicDBObject查询=新的BasicDBObject(,1);
collection.ensureIndex(查询,true);
这可以使用“\u id”字段来完成,但不鼓励使用此字段。 假设您希望名称是唯一的,那么您可以将名称放在“\u id”列中,您可能知道“\u id”列对于每个条目都是唯一的

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

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

对于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"));
    }
}
mycol.create_index("id", unique=True)
public void createUniqueIndex(){
文件索引=新文件(“字段名”,1);
MongoCollection collection=client.getDatabase(“dbName”).getCollection(“CollectionName”);
createIndex(index,newindexoptions().unique(true));
}
//并进行测试以验证其是否按预期工作
@试验
公共无效测试索引(){
MongoCollection collection=client.getDatabase(“dbName”).getCollection(“CollectionName”);
文档newDoc=新文档(“字段名”、“重复值”);
集合。insertOne(newDoc);
//这将抛出MongoWriteException
试一试{
集合。insertOne(newDoc);
失败(“由于密钥重复,应引发mongo写入异常”);
}捕获(Mongowrite例外){
assertTrue(例如getMessage()包含(“重复键”);
}
}

使用pymongo看起来像:

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

注意:
null
和none existant也算作唯一值,因此,如果您有一个用户表,其中有些用户已被删除,并且根据法律,您删除了他们的数据,但保留了他们的行以备将来删除,那么唯一索引将出现问题。我想这是真的需要了。@Sammaye:你可以用它来解决空字段/缺少字段的问题。+1这里的文档中提到过,唯一索引的最后一段:@Stennie Fair,我一定错过了addition@Jinesh谢谢更新答案。