Mongoengine - 查询包含满足多个条件的 EmbeddedDocuments 的文档

Mongoengine - Query Documents that contain EmbeddedDocuments meeting multiple criteria

我只需要查询包含符合多个条件的 EmbeddedDocument 的文档子集。

在以下构造不佳的示例中,我创建了两个简单的文档...

    from mongoengine import EmbeddedDocument, StringField, IntField, Document, EmbeddedDocumentListField, Q
    class Feature(EmbeddedDocument):
        name = StringField(required=True)
        charges = IntField(required=True)

    class Character(Document):
        name = StringField(required=True)
        features = EmbeddedDocumentListField(Feature)

    c = Feature(name='chair', charges=2)
    u = Feature(name='umbrella', charges=1)
    p1 = Feature(name='potion', charges=1)
    p2 = Feature(name='potion', charges=4)
    m = Character(name='Magnus', features=[c, p1])
    t = Character(name='Taako', features=[u, p2])
    m.save()
    t.save()

然后我尝试查询包含名为 'potion' 且收费低于 3 的特征的文档。

    matched_characters = Character.objects(Q(features__name='potion')
                                           & Q(features__charges__lt=3))
    print(matched_characters.to_json())

然而,这 return 是两个文档,因为它们都包含一个名为 'potion' 的特征,并且都包含一个费用小于 3 的特征,但 我真正想要的是仅 return 具有名为 'potion' 且收费少于 3 次的功能的文档。 我如何完成此操作?

此变体具有相同的结果:

matched_characters = Character.objects(features__name='potion',
                                       features__charges__lt=3)

我需要使用 $elemMatch 来确保在同一个 EmbeddedDocument 上满足两个条件:

matched_characters = Character.objects.filter(features__match={
    "name": "potion", "charges__lt": 3
})

此 returns 只有具有名为 'potion' 的特征且收费少于 3 次的文档。