在mongo 3.3中的DBCollection save()等效

时间:2016-12-16 15:37:05

标签: java mongodb mongodb-java mongodb-java-3.3.0

我们目前使用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

的信息
  
      
  • 如果文档不存在指定的'_id'值,则为   method使用文档中的指定字段执行插入。
  •   
  • 如果存在具有指定“_id”值的文档,则为该方法   执行更新,用现有记录替换所有字段   文件中的字段。
  •   

但是我怀疑insertOne实现我现在使用它的效果与之前的save()类似。

  

插入提供的文档。如果文件丢失了   标识符,驱动程序应生成一个

问题 - 有save()采用当前MongoCollection方式的类似方法吗?有没有办法使用_id的{​​{1}}或者在不使用它的情况下做类似的事情?

编辑: Param定义为 -

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

1 个答案:

答案 0 :(得分:1)

您可能想要使用

findOneAndUpdate(Bson filter, Bson update, FindOneAndUpdateOptions options)

将FindOneAndUpdateOptions与upsert选项设置为true。

您可以将_id作为查询过滤器和param作为更新传递,当查询与_id匹配时,它会将值重叠,如果未找到匹配项,则会插入新行。