mongo 3.3 中的 DBCollection save() 等价物

DBCollection save() equivalent in mongo 3.3

我们当前使用 mongo-java-driver:3.0.4 进行文档更新的实现如下 -

private void updateParam(String param1, String param2) {
    Param param = new Param(param1, param2);
    DBCollection collection = mongoClient.getDB("databaseName").getCollection("collectionName");
    collection.save(new BasicDBObject(param.toMap()));
}

其中 param.toMap() 实现为

public Map<String, Object> toMap() {
    return JSONObjectMapper.getObjectMapper().convertValue(this, Map.class);
}

使用 mongo-java-driver:3.4.0-rc1 我尝试的实现是使用 insertOne 作为

private void updateParam(String param1, String param2) {
    Param param = new Param(param1, param2);
    MongoCollection<Param> mongoCollection = mongoClient.getDatabase("databaseName").getCollection("collectionName", Param.class);
    mongoCollection.insertOne(param);
}

考虑来自来源的信息 DBCollection's save

  • If a document does not exist with the specified '_id' value, the method performs an insert with the specified fields in the document.
  • If a document exists with the specified '_id' value, the method performs an update, replacing all field in the existing record with the fields from the document.

但我怀疑 insertOne 的实现,因为我现在使用它来达到与之前 save() 类似的效果。

Inserts the provided document. If the document is missing an identifier, the driver should generate one

问题 - 是否有与 save() 类似的方法与当前的 MongoCollection 方法?有没有办法使用 _id of Param 或做类似的事情而不使用它?


编辑: 参数定义为 -

public class Param {

  private String param2;
  private String param2;

  public Param() {
  }

  public Param(String param1, String param2) {
    this.param1 = param1;
    this.param2 = param2;
  }

  public Map<String, Object> toMap() {
    return JSONObjectMapper.getObjectMapper().convertValue(this, Map.class);
  }

}

并且有一个 ParamCodec implements Codec<Param>,它使用 CodecRegistry 注册给客户端,如下所示:

CodecRegistry codecRegistry = CodecRegistries.fromRegistries(MongoClient.getDefaultCodecRegistry(),
            CodecRegistries.fromCodecs(new ParamCodec()));

MongoClientOptions clientOptions = new MongoClientOptions.Builder()
    ....
    .codecRegistry(codecRegistry)
    .build();

MongoClient(addresses, clientOptions);

您可能想使用

findOneAndUpdate(Bson filter, Bson update, FindOneAndUpdateOptions options)

将 FindOneAndUpdateOptions 的更新插入选项设置为 true。

您可以将 _id 作为查询过滤器传递,将参数作为更新传递,当查询与 _id 匹配时,它将更新该值,如果未找到匹配项,它将插入一个新行。