0

我对 MongoDB 完全陌生。我正在使用 Morphia 从 Java 访问它。我需要按照以下方式做一些事情:

public boolean isUnique(short s){
//OPERATION 1: 检查 mongo 是否存在带有字段 "id" = s 的对象
//如果存在则返回 false
//else,
//OPERATION 2: 在数据库中创建这个对象
//并返回真
}

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

问候,安德斯

4

2 回答 2

1

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

于 2012-09-17T13:21:22.363 回答
1

我正在使用 Java 和 Morphia,所以这就是实际代码的样子,如果将来有人想要实现同样的目标的话。这是在告诉 Mongo 这是一个 upserttrue的调用:updateFirst

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;
  }
于 2012-09-19T12:49:58.910 回答