У меня есть 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? Мой документ уже написан, поэтому я не могу изменить имя полей.
Фактически mongo может различать id и _id, поэтому он не будет рассматривать ваше поле id как поле по умолчанию _id. Запрос с полем id должен работать, я думаю, что нет документа с именем id = 102. – HourGlass
Тогда это странно, в моих двух примерах (objects.all() и objects (status = "")), Если я пишу mod [0] .id, у меня есть '102'-id – Damien
, я попробовал то же самое сценарий с использованием поля id в mongoshell db.collectionname.find() его получение надлежащего документа – HourGlass