MongoDB:根据java中另一个字段的值,使用新字段更新所有文档

时间:2015-11-23 08:59:28

标签: java mongodb

我发现MongoDB java-driver的文档不足以解决这个问题。

我想根据另一个字段的值(时间戳)使用新字段更新集合中的所有文档。

我应该只查询FindIterable<Document>,执行.forEach并使用apply方法执行操作吗?在那种情况下,这将是什么正确的语法?

这是我到目前为止所拥有的。 Document.put没有做到这一点。

private void addDayOfWeekField(MongoDatabase mdb, String collectionName){

    FindIterable<Document> iterable = mdb.getCollection(collectionName).find();
    iterable.forEach(new Block<Document>() {
        @Override
        public void apply(Document document) {
            long timestamp = Long.parseLong(document.get("timestamp").toString())*1000l;
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(timestamp);
            document.put("day_of_week", cal.get(Calendar.DAY_OF_WEEK));
            document.put("hour_of_day", cal.get(Calendar.HOUR_OF_DAY));
        }
    });
}

下面的代码使用新字段更新所有文档,但没有值。正如菲利普所说,UpdateOne可能是正确的方式。

mdb.getCollection(collectionName).updateMany(
            new Document(),
            new Document("$set", new Document("hour_of_day", ""))
    );

提前致谢。

1 个答案:

答案 0 :(得分:0)

document.put更改Java VM中文档的本地副本。数据库没有注意到这一点。要将更改发送回数据库,请使用collection.updateOnecollection.replaceOne