基于最后一个索引的列表嵌入字段上的Mongoengine过滤器查询

乌代·辛格

我将Mongoengine与Django结合使用。

我的模型中有一个嵌入式字段。这是嵌入式文档的列表字段。

import mongoengine

class OrderStatusLog(mongoengine.EmbeddedDocument):
    status_code = mongoengine.StringField()

class Order(mongoengine.DynamicDocument):
    incr_id = mongoengine.SequenceField()
    status = mongoengine.ListField(mongoengine.EmbeddedDocumentField(OrderStatusLog))

现在,我想Order根据status字段中的最后一个值收集结果进行过滤

例如 Order.objects.filter(status__last__status_code="scode")

我猜没有这样的事__last我尝试了文档http://docs.mongoengine.org/guide/querying.html#querying-lists中提到的方法,但是没有用。

我可以通过遍历集合中的所有文档来解决此问题,但那不是很有效,我们如何才能有效地编写此查询。

杰罗姆

我不确定MongoEngine是否可以做到这一点。AFAIK,您需要使用聚合管道。

在Mongo Shell中,使用'$ slice'$arrayElemAt运算符:

db.order.aggregate([{ $project: {last_status: { $arrayElemAt: [{ $slice: [ "$status", -1 ] }, 0 ]} }}, {$match: {'last_status.status_code':"scode"}} ])

在Python中:

pipeline = [
    {'$project': {'last_status': { '$arrayElemAt': [{ '$slice': [ "$status", -1 ] }, 0 ]} }},
    {'$match': {'last_status.status_code':'scode'}}
]

agg_cursor = Order.objects.aggregate(*pipeline)

result = [ Order.objects.get(id=order['_id']) for order in agg_cursor ]

这里的技巧是objects.aggregate提供一个PyMongo游标,而不是一个MongoEngine游标,因此,如果需要MongoEngine对象,则可以分两步进行:首先使用聚合框架进行过滤以获取匹配项的ID,然后通过MongoEngine查询来获取它们

这就是我的工作。根据我的测试,事实证明,它比获取所有内容并在python代码中过滤要有效得多。

如果有更简单的方法,我很想听听。否则,这可能是MongoEngine的功能请求。您可能要在那里开一个问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Tableau中,我想创建一个基于过滤器的计算字段,并根据过滤器输出答案

基于另一个列表的1个列表的流过滤器

第一个密码查询(子查询)的基于过滤器的输出

如何使用列值过滤器查询并获取原始值的最后一个值?

Django过滤器,如果查询中只有最后一个值为真

PHP基于一个文本值过滤器查询所有列

在最后一个函数 pyspark 上应用过滤器

基于另一个过滤器数组

Solr对多个过滤器查询与一个过滤器查询的性能差异

跳过基于另一个过滤器ASP .NET的过滤器执行

Kibana KQL 可视化过滤器 - 排除列表字段的一个值

一个屏幕上带有过滤器的多个React Admin列表

ReactJs试图创建一个过滤器列表

基本过滤器返回一个空列表

AngularJS:控制器中除一个字段外的所有字段上的过滤器

修改表单上的查询字符串以添加基于其他字段的过滤器

如何基于另一个过滤器中的选择来控制过滤器的值

如何设计一个查询,在其中从我想以 RESTful 方式应用过滤器的资源中检索最后一个数据?

Scala-使用过滤器查看一个列表中的值是否与另一个列表中相同索引中的值匹配

基于列表属性的领域Swift过滤器查询

基于2个值的COUNTA查询/过滤器

使用AngularJS自定义过滤器过滤基于另一个集合的一个

Java的名单过滤器,并找到第一个/最后找到

MongoDB Java使用多个过滤器并获得最后一个

如何从过滤器公式中获取最后一个值

骨干-删除集合中的最后一个模型,但仅按过滤器

如何做一个过滤器以将包含null属性的结果放在最后?

对除最后一个值以外的所有值使用过滤器

每个最后一个日期的BigQuery过滤器并使用分区