所以我正在使用 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,但似乎不适用于嵌入式文档。
有人可以告诉我查询嵌入式文档的正确方法是什么吗?
答案 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])