我们目前使用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
答案 0 :(得分:1)
您可能想要使用
findOneAndUpdate(Bson filter, Bson update, FindOneAndUpdateOptions options)
将FindOneAndUpdateOptions与upsert选项设置为true。
您可以将_id作为查询过滤器和param作为更新传递,当查询与_id匹配时,它会将值重叠,如果未找到匹配项,则会插入新行。