2016-12-16 65 views
1

我們當前的實現與mongo-java-driver:3.0.4爲一個文件更新如下 -DBCollection保存()相當於蒙戈3.3

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」值存在,則 方法執行與文檔中的指定字段中的插入件。
  • 如果文檔以指定的_id值存在,則方法 執行更新,將現有記錄中的所有字段替換爲文檔中的字段 。

但是我現在懷疑insertOne實現,我用它來作爲對save()以前類似的效果。

插入所提供的文檔。如果文檔缺少 標識,駕駛人應生成一個

問題 - 有什麼辦法類似的save()當前MongoCollection方法?有沒有辦法使用的Param_id或做不使用它,以及類似的方法嗎?


編輯: 帕拉姆被定義爲 -

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); 
    } 

} 

並具有使用CodecRegistry如下到客戶端註冊的ParamCodec implements Codec<Param>

CodecRegistry codecRegistry = CodecRegistries.fromRegistries(MongoClient.getDefaultCodecRegistry(), 
      CodecRegistries.fromCodecs(new ParamCodec())); 

MongoClientOptions clientOptions = new MongoClientOptions.Builder() 
    .... 
    .codecRegistry(codecRegistry) 
    .build(); 

MongoClient(addresses, clientOptions); 

回答

1

您可能想要使用

findOneAndUpdate(Bson filter, Bson update, FindOneAndUpdateOptions options) 

使用FindOneAndUpdateOptions並將upsert選項設置爲true。

您可以通過_id作爲查詢過濾器和param爲您的更新,並在查詢_id匹配將UPSERT的值,如果沒有找到匹配它會插入新行。

+0

如果'Param'沒有一個叫'場什麼_id'? – nullpointer

+0

但你需要一個標識符字段? Mongo怎麼知道什麼時候更新vs保存?或者您可以傳遞任何其他條件,這些條件將解析爲過濾器中的記錄,並基於該條件是否發生匹配更新,如果不是,則會發生插入。 – Veeram