【问题标题】:How can you query embedded document that is null with mongoengine如何使用 mongoengine 查询为空的嵌入文档
【发布时间】:2019-12-05 18:21:57
【问题描述】:
我是 mongoengine 的新手并正在查询。我得到了一个文档和一个嵌入文档,如下所示:
class Plan(EmbeddedDocument):
name = StringField()
size = FloatField()
class Test(Document):
date = DateTimeField()
plan = EmbeddedDocumentField(Plan)
如何获取所有未设置大小的测试文档。这意味着 size=null/None?
我尝试使用 __raw__ 查询,但这对我不起作用..
【问题讨论】:
标签:
python
mongodb
mongoengine
【解决方案1】:
嵌套/嵌入文档的属性查询方式如下(doc):
class LightSaber(EmbeddedDocument):
color = StringField()
length = FloatField()
class Jedi(Document):
name = StringField()
light_saber = EmbeddedDocumentField(LightSaber)
saber1 = LightSaber(color='red', length=32)
Jedi(name='Obiwan', light_saber=saber1).save()
saber2 = LightSaber(color='yellow', length=None)
Jedi(name='Yoda', light_saber=saber2).save()
Jedi(name='Rey', light_saber=None).save()
for jedi in Jedi.objects(light_saber__length=None):
print(jedi.name)
# prints:
# Yoda
# Rey
话虽如此,通过将属性命名为“size”,您遇到了一个极端情况。事实上,“size”是一个mongoengine operator,所以如果你查询Test.objects(plan__size=None),你会得到一个错误,因为MongoEngine 认为你想使用size 操作符。
要对 __raw__ 做同样的事情,您需要使用以下代码:
for jedi in Jedi.objects(__raw__={'light_saber.length': None}):
print(jedi.name)
使用 __raw__ 也适用于“大小”,在您的示例中为:Test.objects(__raw__={'plan.size': None})