首页 > 解决方案 > 使用 Mongoengine 对文档中的两个键进行求和或差运算

问题描述

我已经定义了一个模型

Class Orders(Document):
     orderAmount = fields.FloatField()
     cashbackAmount = fields.FloatField()
     meta = {'strict': False}

我想获得所有订单(orderAmount - cashbackAmount 值> 500)。我正在使用 Mongoengine 并使用它来执行此操作。我没有使用 Django 框架,所以我不能使用它的解决方案。

标签: python-3.xmongodbmongoengine

解决方案


如果你不得不在没有 Mongoengine 的情况下这样做,让我们来解决这个问题。你可以先把这个问题分成两个步骤

1)如何获取两个字段之间的差异并将其输出为新字段?

2)如何根据该字段的值过滤所有文档?

您可以看到它由几个步骤组成,因此它看起来像是聚合框架的一个很好的用例。

第一个问题可以使用addFieldssubtract运算符来解决。

{$addFields: {difference: {$subtract: ["$a", "$b"]}}}

可以翻译成“为每个文档添加一个称为差异的新字段difference=a-b”。

第二个问题是一个简单的过滤:

{$match: {difference:{$gt: 500}}}

“给我所有差异字段大于 500 的文件”

所以 MongoDB 中的整个查询看起来像这样

db.collectionName.aggregate([{$addFields: {difference: {$subtract: ["$a", "$b"]}}}, {$match: {difference:{$gt: 500}}}])

现在我们必须把它翻译成Mongoengine。事实证明,aggregate定义了方法,因此我们可以轻松地进行小的调整以使该查询正常工作。

Diff.objects.aggregate({"$addFields": {"difference": {"$subtract": ["$a", "$b"]}}}, {"$match": {"difference":{"$gt": 500}}})

结果,您将获得 CommandCursor。您可以与该对象交互或将其转换为列表,以获取字典列表。


推荐阅读