我是MongoDB的新手。我正在使用Morphia从Java访问它。我需要做一些类似的事情:
public boolean isUnique(short s){
操作 1:如果存在
字段"id" = s 的对象,则签入 mongo 如果是这样,则返回 false
还
操作 2:在数据库中
创建此对象 并返回 true
}
我要掌握的问题不是实际的语法,而是原子性的问题。如何确保只有一个线程/进程可以访问文档,以便 OP1 和 OP2 是原子的?我认为这必须在数据库级别进行管理,因为 Java 服务器位于集群环境中。
问候安德斯
您可以将这两个操作替换为 {id: s} 文档的一个更新插入,如果文档已存在,则变为无操作,但如果不存在,则成为插入。 调用 getLastError
命令(驱动程序可以为您执行此操作)将告诉您是否已创建新文档。
我正在使用Java和Morphia,所以这是实际代码的样子,如果有人想要在未来实现同样的事情。这是给updateFirst
的电话中的true
,告诉Mongo这是一个更新器:
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;
}