2016-02-28 130 views
0

我使用的是MongoDB 3.2和MongoDB Java Driver 3.2。我想更新具有其ID的文檔的值。爲了做到這一點我嘗試使用以下兩種方法(在StackoverflowMongoDB Blog發現):使用Java更新MongoDB中的文檔

方法1:

for(String docID : expiredDocsIDs) { 
    Bson filter = Filters.eq("_id", docID); 
    Bson updates = Updates.set("isExpired", true); 

    dbCollection.findOneAndUpdate(filter, updates); 
} 

方法2:

expiredDocsIDs.stream() 
    .forEach(docID -> { 
     BasicDBObject searchQuery = new BasicDBObject("_id", docID); 
     BasicDBObject updateFields = new BasicDBObject(); 
     updateFields.append("isExpired", true); 
     updateFields.append("fetchStatus", "FETCHED"); 
     BasicDBObject setQuery = new BasicDBObject(); 
     setQuery.append("$set", updateFields); 

     dbCollection.updateOne(searchQuery, setQuery); 
}); 

這些方法都不起作用。 它遍歷文檔ID列表,執行代碼,但在代碼結束時,當我檢查DB中的文檔時,我試圖更新的文檔字段中沒有任何更改。

我的問題:
我怎樣才能在MongoDB更新的特定文件?

+0

AFAIK那些是唯一可能的解決方案。 – Pragnani

+0

@PragnaniKinnera,它不適合我。我檢查過,'_id'是正確的,但代碼執行後沒有任何改變。我想念什麼? –

+0

我認爲你肯定錯過了一些東西。什麼不起作用?如何解釋你認爲「不工作」的含義。那麼發生了什麼?你期望發生什麼?所有這些在這個問題上都是缺失的。瞭解我們其他人,我們就是這麼做的。所以我們需要了解爲什麼它不夠好。 –

回答

0

由於BlakesSeven正確指出,問題是與鑄造_id字段。原始代碼發送此參數爲String,而正確的方法是發送ObjectId類型的參數。

正確和工作代碼形式MongoDB 3.2:

this.trackedEpisodesReg.entrySet().stream() 
    .filter(ep -> ep.getValue().isExpired()) 
    .forEach(ep -> { 

     BasicDBObject updateFields = new BasicDBObject(); 
     updateFields.append("isExpired", true); 

     BasicDBObject setQuery = new BasicDBObject(); 
     setQuery.append("$set", updateFields); 

     BasicDBObject searchQuery = new BasicDBObject("_id", new ObjectId(ep.getValue().getEpisodeID())); 

     dbCollection.updateOne(searchQuery, setQuery); 
    });