【问题标题】:Mongoengine - Query Documents that contain EmbeddedDocuments meeting multiple criteriaMongoengine - 查询包含满足多个条件的 EmbeddedDocuments 的文档
【发布时间】:2021-05-12 20:33:41
【问题描述】:

我只需要查询包含满足多个条件的 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()

然后我尝试查询包含名为“药水”且费用低于 3 的特征的文档。

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

然而,这会返回两个文档,因为它们都包含一个名为“药水”的功能,并且都包含一个收费小于 3 的功能,但是 我真正想要的是只返回一个具有名为'的功能的文档药水少于 3 次。 我怎样才能做到这一点?

这个变种的结果是一样的:

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

【问题讨论】:

    标签: python mongoengine


    【解决方案1】:

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

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

    这仅返回具有名为“药水”的特征且使用次数少于 3 次的文档。

    【讨论】:

      猜你喜欢
      • 2018-06-12
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2016-10-29
      • 2020-07-16
      • 2016-04-23
      相关资源
      最近更新 更多