【发布时间】:2016-12-16 15:37:04
【问题描述】:
我们当前使用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 as
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' 值的文档,则 方法对文档中的指定字段执行插入操作。
- 如果存在具有指定 '_id' 值的文档,则方法 执行更新,将现有记录中的所有字段替换为 文档中的字段。
但我现在怀疑insertOne 的实现,因为我使用它的效果与之前的save() 相似。
插入提供的文档。如果文档缺少 标识符,驱动程序应该生成一个
问题 - 有没有与save() 类似的方法与当前的MongoCollection 方法?有没有办法使用_id 或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);
【问题讨论】:
标签: java mongodb mongodb-java mongodb-java-3.3.0