有没有办法按照对象中两个值之间的最大差值对MongoDB记录进行排序?

5ssjco0h  于 2022-11-22  发布在  Go
关注(0)|答案(2)|浏览(125)

我有一个数据库,其中的记录如下所示:

{
  id: someId
  initialValue: 100
  currentValue: 150
  creationDate: someDate
}

我必须得到currentValueinitialValue之间差值最大的值。是否可以在MongoDB中编写一个排序函数,将一个值从另一个值中减去,然后对它们进行比较(排序)?

chhkpiq4

chhkpiq41#

其中一个稍微有点过火但可扩展的解决方案是使用$setWindowFields to $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

svdrlsy4

svdrlsy42#

当然,只需先生成所需的值,然后在前面的$addFields阶段中进行排序即可:

{
    $addFields: {
      diff: {
        "$subtract": [
          "$currentValue",
          "$initialValue"
        ]
      }
    }
  },
  {
    $sort: {
      diff: -1
    }
  }

Playground example here
请注意,此操作 * 不能 * 使用索引,因此必须手动对数据进行排序。这可能是一个繁重和/或缓慢的操作。您可能希望在写入文档并对其编制索引时保留该值。这会略微增加写入开销,但会显著减少执行读取所需的工作量和时间。

相关问题