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



我是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;
  }

相关内容

最新更新