Невозможно получить доступ к записи монго по "id"

У меня есть Mongo Document с некоторыми полями (_id, id, name, status и т.д...). Я написал типовой документ в классе (как это сделала бы модель):

class mod(Document):
    id=fields.IntField()  
    name = fields.StringField()
    status=fields.StringField()
    description_summary = fields.StringField()
    _id = fields.ObjectIdField()

И с этой моделью я попытался получить к ним доступ:

    >>> from mongoengine import *
    >>> from api.models import *
    >>> connect('doc')
    MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True, read_preference=Primary())

Я попытался получить все записи в документе "мод": Это сработало! Я могу получить все поля всех записей (идентификатор, имя и т.д...)

    >>> mod_ = mod.objects.all()
    >>> mod_[0].name
    'Name of entry'
    >>> mod_[0].id
    102

Я попытался отфильтровать и вернуть все записи с полем "status" = "Incomplete": он работает, как и раньше. Я пытался отфильтровать другие поля: он тоже работает

    >>> mod_ = mod.objects(status="Incomplete")
    >>> mod_[0].name
    'Name of entry'
    >>> mod_[0].id
    102

Но когда я пытаюсь фильтровать по идентификатору, мне не удается получить результат:

    >>> mod_ = mod.objects(id=102)
    >>> mod_[0].name
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "/.../lib/python3.4/site-packages/mongoengine/queryset/base.py", line 193, in __getitem__
        return queryset._document._from_son(queryset._cursor[key],
      File "/.../lib/python3.4/site-packages/pymongo/cursor.py", line 570, in __getitem__
        raise IndexError("no such item for Cursor instance")
    IndexError: no such item for Cursor instance
    >>> mod_[0].id
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
      File "/.../lib/python3.4/site-packages/mongoengine/queryset/base.py", line 193, in __getitem__
        return queryset._document._from_son(queryset._cursor[key],
      File "/.../lib/python3.4/site-packages/pymongo/cursor.py", line 570, in __getitem__
        raise IndexError("no such item for Cursor instance")
    IndexError: no such item for Cursor instance

Итак, я попробовал с mod.objects.get(id=102)

>>> mod_ = mod.objects.get(id=102)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/.../lib/python3.4/site-packages/mongoengine/queryset/base.py", line 271, in get
    raise queryset._document.DoesNotExist(msg)
api.models.DoesNotExist: mod matching query does not exist.

Запрос на соответствие мода не существует, поэтому он не распознает поле id, но когда я пишу mod_[0].id У меня есть результат, так что может быть не так?

РЕДАКТИРОВАТЬ: я считаю, что при написании mod.objects(id=102) идентификатор поля интерпретируется как _id. Как я могу указать, я хочу запросить по идентификатору, а не _id? Мой документ уже написан, поэтому я не могу изменить имя поля.

1 ответ

Решение

Итак, проблема не в разнице между _id и id, как сказал HourGlass. Значения поля id были сохранены как целые числа, я написал fields.IntField() для поля id и вызвал mod.objects(id=102) (без кавычек).

Но по какой-то причине я должен написать их как fields.StringField(), и вызвать mod.objects(id='102'),

Другие вопросы по тегам