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 匹配时,它将更新该值,如果未找到匹配项,它将插入一个新行。
我们当前使用 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 匹配时,它将更新该值,如果未找到匹配项,它将插入一个新行。