【问题标题】:Query embedded documents with mongo engine使用 mongo 引擎查询嵌入文档
【发布时间】:2019-10-10 16:36:24
【问题描述】:

所以我使用 mongoengine 来查询嵌入的文档。

架构:项目

class _StatusFields(mongoengine.EmbeddedDocument):
    start_time = mongoengine.DateTimeField()

class _Status(mongoengine.EmbeddedDocument):
    start = mongoengine.EmbeddedDocumentField(
        _StatusFields, default=_StatusFields()
    )
    complete = mongoengine.EmbeddedDocumentField(
        _StatusFields, default=_StatusFields()
    )
class Project(mongoengine.Document):
    status = mongoengine.EmbeddedDocumentField(_Status,  default=_Status),
    location = mongoengine.StringField()

如您所见,我将 _Status 用作 项目 中的嵌入文档。我需要查询项目中的status,即嵌入文档。

所以这是我尝试过的代码:

filter = {'status__in': ['complete']}
project_objects = Project.objects(**filter).all()

但我收到此错误: mongoengine.errors.InvalidQueryError: Querying the embedded document '_Status' failed, due to an invalid query value

它适用于字符串和 objectIds,但它似乎不适用于嵌入文档。

谁能告诉我查询嵌入式文档的正确方法是什么?

【问题讨论】:

    标签: python mongodb pymongo mongoengine


    【解决方案1】:

    Project.status 是一个 EmbeddedDocument(即:嵌套结构),您正在使用字符串查询该字段,但它需要一个 EmbeddedDocument 实例。根据您想要实现的目标(查询 Project.status 或 Project.status.complete),您可以执行以下操作:

    # Saving an object in db
    now = datetime.utcnow()
    status = _Status(start=_StatusFields(start_time=now), complete=_StatusFields(start_time=now))
    Project(status=status, location='whatever').save()
    
    # Fails because Project.status is not a string so can't be queried using a string
    # Project.objects(status__in=['complete'])
    
    # queries Project.status.start_time
    Project.objects(status__start__start_time=now)   
    
    # queries Project.status using a _Status object
    status_object = _Status(start=_StatusFields(start_time=now), complete=_StatusFields(start_time=now))
    Project.objects(status__in=[status_object])
    

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多