如何使用 mongoengine 查询为空的嵌入式文档

How can you query embedded document that is null with mongoengine

我是 mongoengine 的新手,正在查询。我得到了一个文档和一个嵌入式文档,如下所示:

class Plan(EmbeddedDocument):
   name = StringField()
   size = FloatField()

class Test(Document):
   date = DateTimeField()
   plan = EmbeddedDocumentField(Plan)

如何获取所有未设置大小的测试文档。也就是说size=null/None? 我用 __raw__ 查询尝试过,但这对我不起作用..

nested/embedded个文档的属性查询方式如下(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 认为你想使用大小运算符。

要对 __raw__ 执行相同操作,您需要使用以下内容:

for jedi in Jedi.objects(__raw__={'light_saber.length': None}):
    print(jedi.name)

使用 __raw__ 也可以很好地与 "size" 一起使用,在您的示例中是:Test.objects(__raw__={'plan.size': None})