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
Java 在MongoDB中查询唯一性,如果唯一,则插入_Java_Mongodb_Morphia_Atomicity - Fatal编程技术网

Java 在MongoDB中查询唯一性,如果唯一,则插入

Java 在MongoDB中查询唯一性,如果唯一,则插入,java,mongodb,morphia,atomicity,Java,Mongodb,Morphia,Atomicity,我对MongoDB完全陌生。我正在使用Morphia从Java访问它。 我需要做一些类似的事情: 公共布尔值是唯一的(短s){ //操作1:检查mongo中是否存在字段“id”=s的对象 //如果是,则返回false //否则, //操作2:在数据库中创建此对象 //并返回true } 我要理解的问题不是实际的语法,而是原子性的问题。我如何确保只有一个线程/进程可以访问文档,以便OP1和OP2是原子的? 我认为这必须在数据库级别进行管理,因为Java服务器位于集群环境中 问候,, Anders您

我对MongoDB完全陌生。我正在使用Morphia从Java访问它。 我需要做一些类似的事情:

公共布尔值是唯一的(短s){
//操作1:检查mongo中是否存在字段“id”=s的对象
//如果是,则返回false
//否则,
//操作2:在数据库中创建此对象
//并返回true
}

我要理解的问题不是实际的语法,而是原子性的问题。我如何确保只有一个线程/进程可以访问文档,以便OP1和OP2是原子的? 我认为这必须在数据库级别进行管理,因为Java服务器位于集群环境中

问候,,
Anders

您可以将这两个操作替换为{id:s}文档中的一个,如果该文档已经存在,则该文档将变为no op,如果不存在,则替换为insert。调用命令(驱动程序可以为您执行此操作)将告诉您是否创建了新文档。

我使用的是Java和Morphia,因此,如果将来有人希望实现同样的目标,那么下面是实际代码的样子。调用
updateFirst
中的
true
告诉Mongo这是一个upsert:

public boolean checkIfExistsAndInsertOtherwise(short id){
    Datastore datastore = getDatastore();
    Query<OrganizationId> updateQuery = datastore.createQuery(OrganizationId.class).field("identificationNumber").equal(id);

    //Bogus operation, just set id to itself
    UpdateOperations<OrganizationId> ops = datastore.createUpdateOperations(OrganizationId.class).set("identificationNumber", id);

    UpdateResults<OrganizationId> result = datastore.updateFirst(updateQuery, ops, true,WriteConcern.SAFE);

    return result.getInsertedCount() == 0;
  }
public boolean checkifexist和insertotherwise(短id){
Datastore Datastore=getDatastore();
Query updateQuery=datastore.createQuery(OrganizationId.class).field(“identificationNumber”).equal(id);
//伪操作,只需将id设置为自身
UpdateOperations ops=datastore.createUpdateOperations(OrganizationId.class).set(“identificationNumber”,id);
UpdateResults result=datastore.updateFirst(updateQuery,ops,true,WriteConcern.SAFE);
返回结果。getInsertedCount()==0;
}