过滤MongoEngine中的嵌入列表

时间:2011-09-10 00:10:12

标签: python mongodb mongoengine

如果我有这些模型:

class Sub(EmbeddedDocument):
    name = StringField()

class Main(Document):
    subs = ListField(EmbeddedDocumentField(Sub))

我想要一个返回Mains的查询,其中subs按名称现有

进行过滤
Main.objects.filter(subs__name__exists=True)

这将返回正确的Mains,但Subs始终是整个列表,而不是子集。我怎样才能获得子集?我需要依赖列表推导吗?

1 个答案:

答案 0 :(得分:2)

MongoDB不支持您正在请求的此操作,因此Mongoengine也不支持。

您可以对阵列(列表)执行切片操作,但不能对ad-hoc过滤执行切片操作。在MongoDB数组中切片的工作方式类似于在Python中切片列表,您可以使用slice__关键字语法对Mongoengine进行切换:

Main.objects.filter(subs__name__exists=True).fields(slice__subs=[0,2])

这将返回从索引0开始的subs(即第一个元素),然后返回两个元素。