2017-02-06 7 views
1

У меня есть Mongo Document с некоторыми полями (_id, id, name, status и т. Д.). Я написал типичный документ в классе (например, модель будет делать):Невозможно получить доступ к записи mongo по «id»

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()) 

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

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

Я пытался фильтровать и возвращать все записи с полем «статус» = «неполном»: Это работает, так же, как before.I пытался фильтровать другие поля: он работает слишком

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

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

EDIT: Я считаю, что при записи mod.objects (id = 102) поле id интерпретируется как _id. Как я могу указать, я хочу задать вопрос по id и не _id? Мой документ уже написан, поэтому я не могу изменить имя полей.

+1

Фактически mongo может различать id и _id, поэтому он не будет рассматривать ваше поле id как поле по умолчанию _id. Запрос с полем id должен работать, я думаю, что нет документа с именем id = 102. – HourGlass

+0

Тогда это странно, в моих двух примерах (objects.all() и objects (status = "")), Если я пишу mod [0] .id, у меня есть '102'-id – Damien

+1

, я попробовал то же самое сценарий с использованием поля id в mongoshell db.collectionname.find() его получение надлежащего документа – HourGlass

ответ

0

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

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

Смежные вопросы