使用Java更新MongoDB中的文档

时间:2016-02-28 07:38:42

标签: java mongodb mongodb-query crud

我正在使用MongoDB 3.2和MongoDB Java Driver 3.2。我想更新具有其ID的文档的值。为了做到这一点,我尝试使用以下两种方法(在StackoverflowMongoDB Blog中找到):

方法#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中的特定文档?

1 个答案:

答案 0 :(得分:2)

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