Java 在MongoDB中查询唯一性,如果唯一,则插入
我对MongoDB完全陌生。我正在使用Morphia从Java访问它。 我需要做一些类似的事情: 公共布尔值是唯一的(短s){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您
//操作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;
}