在MongoEngine中过滤嵌入列表
如果我有这些模型:
class Sub(EmbeddedDocument):
name = StringField()
class Main(Document):
subs = ListField(EmbeddedDocumentField(Sub))
我想要一个查询,返回主项(Mains),同时子项(Subs)要根据名字进行过滤,只返回存在的子项。
Main.objects.filter(subs__name__exists=True)
这个查询能正确返回主项,但子项总是返回整个列表,而不是一个子集。我该怎么才能只得到这个子集呢?我需要依赖列表推导式吗?
1 个回答
3
MongoDB不支持你所请求的这个操作,所以Mongoengine也不支持。
你可以对数组(列表)进行切片操作,但不能进行临时的过滤。MongoDB中的数组切片操作和Python中的列表切片类似,你可以使用Mongoengine的slice__
关键字语法来实现:
Main.objects.filter(subs__name__exists=True).fields(slice__subs=[0,2])
这个操作会从索引0开始(也就是第一个元素),然后返回后面的两个元素。