【问题标题】:DBCollection save() equivalent in mongo 3.3mongo 3.3 中的 DBCollection save() 等效项
【发布时间】: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 方法?有没有办法使用_idParam 或做类似的事情而不使用它?


编辑: 参数定义为 -

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&lt;Param&gt;,它使用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


    【解决方案1】:

    你可能想使用

    findOneAndUpdate(Bson filter, Bson update, FindOneAndUpdateOptions options)
    

    将 FindOneAndUpdateOptions 的 upsert 选项设置为 true。

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

    【讨论】:

    • 如果Param 没有名为_id 的字段怎么办?
    • 但是你需要一个标识符字段??? Mongo如何知道何时更新与保存?或者,您可以传递任何其他条件,这些条件将解析为过滤器中的记录,并基于此条件,如果匹配更新发生,则插入发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多