在MongoDB中搜索文档时如何使用两个字段的总和?

How to use the sum of two fields when searching for a document in MongoDB?

我有一个帐户集合,我正试图找到一个帐户,其中 targetAmount >= totalAmount + N

{
  "_id": {
    "$oid": "60d097b761484f6ad65b5305"
  },
  "targetAmount": 100,
  "totalAmount": 0,
  "highPriority": false,
  "lastTimeUsed": 1624283088
}

现在我只是 select 所有帐户,遍历它们并检查是否满足条件。但我正试图在一个查询中完成这一切:

amount = 10

tasks = ProviderAccountTaskModel.objects(
    __raw__={
        'targetAmount': {
            '$gte': {'$add': ['totalAmount', amount]}
        }
    }
).order_by('-highPriority', 'lastTimeUsed')

我也尝试过使用 $sum,但是这两个选项都不起作用。
搜索的时候不能用,还是我走错路了?

您必须使用聚合而不是 find 命令,因为除了算术运算之外文档的自引用将不起作用。

以下是您要查找的聚合命令。将其转换为 motoengine 等效命令。

db.collection.aggregate([
  {
    "$match": {
      "$expr": {
        "$gte": [
          "$targetAmount",
          {
            "$sum": [
              "$totalAmount",
              10
            ]
          },
        ],
      },
    },
  },
  {
    "$sort": {
      "highPriority": -1,
      "lastTimeUsed": 1,
    },
  },
])

Mongo Playground Sample Execution

您可以使用 $where。请注意,它会相当慢(必须在每条记录上执行 Javascript 代码),因此如果可以,请结合索引查询。

db.getCollection('YourCollectionName').find( { $where: function() { return this.targetAmount > (this.totalAmount + 10) } })

或更紧凑的方式是

db.getCollection('YourCollectionName').find( { $where: "this.targetAmount > this.totalAmount +  10" })