我有一个数据库,其中的记录如下所示:
{ id: someId initialValue: 100 currentValue: 150 creationDate: someDate }
我必须得到currentValue和initialValue之间差值最大的值。是否可以在MongoDB中编写一个排序函数,将一个值从另一个值中减去,然后对它们进行比较(排序)?
currentValue
initialValue
chhkpiq41#
其中一个稍微有点过火但可扩展的解决方案是使用$setWindowFields to $rank计算$subtract的和。如果将来需要进行更改,您可以通过设置其他函数来操作排名字段。这种开箱即用的行为还提供了平局决胜功能。
$setWindowFields
$rank
$subtract
db.collection.aggregate([ { "$addFields": { "diff": { "$subtract": [ "$currentValue", "$initialValue" ] } } }, { "$setWindowFields": { "partitionBy": null, "sortBy": { "diff": -1 }, "output": { "rank": { $rank: {} } } } }, { $sort: { rank: 1 } }, // cosmetics { "$unset": [ "diff", "rank" ] } ])
Mongo Playground
svdrlsy42#
当然,只需先生成所需的值,然后在前面的$addFields阶段中进行排序即可:
$addFields
{ $addFields: { diff: { "$subtract": [ "$currentValue", "$initialValue" ] } } }, { $sort: { diff: -1 } }
Playground example here请注意,此操作 * 不能 * 使用索引,因此必须手动对数据进行排序。这可能是一个繁重和/或缓慢的操作。您可能希望在写入文档并对其编制索引时保留该值。这会略微增加写入开销,但会显著减少执行读取所需的工作量和时间。
2条答案
按热度按时间chhkpiq41#
其中一个稍微有点过火但可扩展的解决方案是使用
$setWindowFields
to$rank
计算$subtract
的和。如果将来需要进行更改,您可以通过设置其他函数来操作排名字段。这种开箱即用的行为还提供了平局决胜功能。Mongo Playground
svdrlsy42#
当然,只需先生成所需的值,然后在前面的
$addFields
阶段中进行排序即可:Playground example here
请注意,此操作 * 不能 * 使用索引,因此必须手动对数据进行排序。这可能是一个繁重和/或缓慢的操作。您可能希望在写入文档并对其编制索引时保留该值。这会略微增加写入开销,但会显著减少执行读取所需的工作量和时间。