在MongoEngine中过滤嵌入列表

4 投票
1 回答
3806 浏览
提问于 2025-04-17 01:57

如果我有这些模型:

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开始(也就是第一个元素),然后返回后面的两个元素。

撰写回答