0

考虑一组具有以下字段的对象:

{
    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(或任何数据库本身)非常陌生。

4

1 回答 1

1

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

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

UPDATE foo SET field1 = field1 / 2;

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

于 2013-07-03T08:35:35.337 回答