Запрос встроенных документов с механизмом Монго - PullRequest
0 голосов
/ 24 мая 2019

, поэтому я использую 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 в качестве внедренного документа в Project . Мне нужно запросить статус в проекте, который является внедренным документом.

Вот код, который я пробовал:

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

Он работает для строк и идентификаторов объектов, но, похоже, не добавляет для встроенных документов.

Может кто-нибудь сказать мне, как правильно запрашивать встроенные документы?

1 Ответ

0 голосов
/ 25 мая 2019

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])
...