使用java在mongodb中使用表达式更新给定字段的值

时间:2013-07-03 04:59:48

标签: java mongodb mongodb-query

考虑具有以下字段的对象集合:

{
    id: // String
    type: //Integer
    score: //Double value
}

我想使用类型查询集合,并且对于返回的文档,将它们的分数除以最大值。请考虑以下查询对象:

DBObject searchQuery = new BasicDBObject("type", 2);
collection.find(searchQuery);

通过上述查询,它将返回一些文档。我希望在所有这些文档中获得maximum分,然后通过获得maximum来划分所有这些文档的分数。

我该怎么做?

我可以按如下方式找到使用聚合的最大值:

String propertyToOperateOn = "score";

DBObject match = new BasicDBObject("$match", searchQuery);

DBObject groups = new BasicDBObject("_id", null);
DBObject operation = new BasicDBObject("$max", "$" + propertyToOperateOn);
groups.put("maximum", operation);

DBObject apply = new BasicDBObject("$group", groups);
AggregationOutput output = mongoConstants.IAScores.aggregate(match, apply);

此处输出将包含最大值。但是,如何通过这个最大值来更新(划分)所有文档的分数?

我希望有更好的方法来完成这项任务,但我无法得到它,因为我对mongodb(或任何数据库)都非常新。

1 个答案:

答案 0 :(得分:1)

这在技术上与“mongodb: java: How to update a field in MongoDB using expression with existing value”相同,但我会重复一遍:

目前,MongoDB不允许您根据字段的现有值更新字段的值。这意味着,您无法执行以下SQL:

UPDATE foo SET field1 = field1 / 2;

在MongoDB中,您需要在应用程序中执行此操作,但请注意,这不再是原子操作,因为您需要读取然后再写入。