【问题标题】: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})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-02
      • 2022-10-21
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多