我已经定义了一个模型
Class Orders(Document):
orderAmount = fields.FloatField()
cashbackAmount = fields.FloatField()
meta = {'strict': False}
我想获取所有订单(orderAmount-cashbackAmount值> 500)。我正在使用Mongoengine,并希望执行该操作。我没有使用Django Framework,所以无法使用该解决方案。
答案 0 :(得分:1)
如果您必须在没有Mongoengine的情况下执行此操作,请让我们解决这个问题。首先将这个问题分为两个步骤
1)如何获取两个字段之间的差异并将其作为新字段输出?
2)如何根据该字段的值过滤所有文档?
您可以看到它由几个步骤组成,因此它看起来像是聚合框架的绝佳用例。
可以使用addFields
和subtract
运算符解决第一个问题。
{$addFields: {difference: {$subtract: ["$a", "$b"]}}}
可以翻译为“为每个文档在difference=a-b
处添加一个名为“ difference”的新字段”。
第二个问题是简单的过滤:
{$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。您可以与该对象进行交互,也可以将其转换为列表,以获得字典列表。