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 次的文档。
我只需要查询包含符合多个条件的 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 次的文档。