使用mongo引擎查询嵌入式文档

时间:2019-05-24 05:41:59

标签: python mongodb pymongo mongoengine

所以我正在使用 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 作为项目中的嵌入式文档。我需要查询项目中的状态,它是一个嵌入式文档。

这是我尝试过的代码:

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,但似乎不适用于嵌入式文档。

有人可以告诉我查询嵌入式文档的正确方法是什么吗?

1 个答案:

答案 0 :(得分:0)

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])
相关问题