考虑具有以下字段的对象集合:
{
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(或任何数据库)都非常新。
答案 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中,您需要在应用程序中执行此操作,但请注意,这不再是原子操作,因为您需要读取然后再写入。