python-3.x - 使用 Mongoengine 对文档中的两个键进行求和或差运算
问题描述
我已经定义了一个模型
Class Orders(Document):
orderAmount = fields.FloatField()
cashbackAmount = fields.FloatField()
meta = {'strict': False}
我想获得所有订单(orderAmount - cashbackAmount 值> 500)。我正在使用 Mongoengine 并使用它来执行此操作。我没有使用 Django 框架,所以我不能使用它的解决方案。
解决方案
如果你不得不在没有 Mongoengine 的情况下这样做,让我们来解决这个问题。你可以先把这个问题分成两个步骤
1)如何获取两个字段之间的差异并将其输出为新字段?
2)如何根据该字段的值过滤所有文档?
您可以看到它由几个步骤组成,因此它看起来像是聚合框架的一个很好的用例。
第一个问题可以使用addFields
和subtract
运算符来解决。
{$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。您可以与该对象交互或将其转换为列表,以获取字典列表。
推荐阅读
- c++ - 从模板参数的模板参数中提取值
- ios - 如何编辑 UITableViewController
- r - R 的 lm 函数如何处理因子级别(在 C_Cdqrls 中?)?
- mysql - 在没有扫描全表的情况下获取mysql中每个组的最后5行
- python - 如何在 Python 中使用字符串中的变量?
- java - Java 为缺少的依赖项/JAR 生成“存根”
- java - Apache Commons Lang:“lang”和“lang3”之间的“不兼容”会导致不同的运行时结果吗?
- c++ - 使用 std::complex 将 int 转换为 double 以进行 `*` 操作
- flutter - 颤动如何获得动态或自动高度值
- python - 在 csv 中使用嵌套列表存储数据的最佳方法是什么?