2013-09-13 4 views
2

Я играю с monogdb для задания, и я столкнулся с следующей проблемой: документ, возвращенный pymongo, не соответствует тому, что возвращается . Простой test.py:pymongo возвращает разные данные, чем MongoDB Shell

from pymongo import MongoClient 
from bson.objectid import ObjectId 

client = MongoClient() 
db = client['dev_database'] 
print db.trials.find_one(ObjectId('522f975dc91e273451569942')) 
print list(db.trials.find({'_id':ObjectId('522f975dc91e273451569942')})) 

Выполнение этого в обоих направлениях на всякий случай. Это возвращает:

{u'nurse_id': u'522f975dc91e273451569941', u'question_ids': [], u'name': u'Test Trial', u'clinician_id': u'522f975dc91e273451569940', u'arms': {u'Med1': u'', u'Placebo': u''}, u'participant_ids': [], u'keywords': [u'abc', u'123'], u'_id': ObjectId('522f975dc91e273451569942')} 
[{u'nurse_id': u'522f975dc91e273451569941', u'question_ids': [], u'name': u'Test Trial', u'clinician_id': u'522f975dc91e273451569940', u'arms': {u'Med1': u'', u'Placebo': u''}, u'participant_ids': [], u'keywords': [u'abc', u'123'], u'_id': ObjectId('522f975dc91e273451569942')}] 

И если я делаю то же самое внутри MongoDB Shell:

> use dev_database 
switched to db dev_database 
> db.trials.find('522f975dc91e273451569942') 
{ "_id" : "522f975dc91e273451569942", "nurse_id" : "522f975dc91e273451569941", "question_ids" : [ ], "name" : "Test Trial", "clinician_id" : "522f975dc91e273451569940", "arms" : { "Med1" : "", "Placebo" : "" }, "participant_ids" : [ 
     "52325b93c91e274e81f4bdda", 
     "52325b93c91e274e81f4bddb", 
     "52325b93c91e274e81f4bddc", 
     "52325b93c91e274e81f4bddd", 
     "52325b93c91e274e81f4bdde" 
], "keywords" : [ "abc", "123" ] } 
> 

Как вы можете видеть, test.py возвращает документ, в котором participant_ids является пустым списком, но MongoDB Shell говорит иначе.

Я понятия не имею, почему это так, и кажется, что я должен сделать простую, но принципиальную ошибку где-то.

ответ

2

Проблема оказалась в том, что мой код сохранен дубликат этого документа, в котором _id был типа str. например

> db.trials.find() 
{ "_id" : ObjectId("522f975dc91e273451569942"), "nurse_id" : "522f975dc91e273451569941", "question_ids" : [ ], "name" : "Test Trial", "clinician_id" : "522f975dc91e273451569940", "arms" : { "Med1" : "", "Placebo" : "" }, "participant_ids" : [ ], "keywords" : [ "abc", "123" ] } 
{ "_id" : "522f975dc91e273451569942", "nurse_id" : "522f975dc91e273451569941", "question_ids" : [ ], "name" : "Test Trial", "clinician_id" : "522f975dc91e273451569940", "arms" : { "Med1" : "", "Placebo" : "" }, "participant_ids" : [ 
     "52325b93c91e274e81f4bdda", 
     "52325b93c91e274e81f4bddb", 
     "52325b93c91e274e81f4bddc", 
     "52325b93c91e274e81f4bddd", 
     "52325b93c91e274e81f4bdde" 
], "keywords" : [ "abc", "123" ] } 

MongoDB Shell всегда возвращает второй результат, в то время как тестовый код возвращает первый. Разница заключается в том, что мой код явно добавляет ObjectId, в то время как MongoDB Shell кажется счастливым попытаться найти совпадение, используя str.

Тот факт, что у результата MongoDB Shell не было ObjectId(...) в поле _id, должно было предупредить меня, что что-то не так.

0

Каким будет выход следующего кода?

from pymongo import MongoClient 
from bson.objectid import ObjectId 

client = MongoClient() 
db = client['dev_database'] 
print json.dumps(db.trials.find_one(ObjectId('522f975dc91e273451569942'))) 
+0

Неудивительно: 'TypeError: ObjectId ('522f975dc91e273451569942') не является JSON serializable' – freespace

+0

Извините, это была моя ошибка. Похоже, что .find() возвращает правильные данные, но «print list()» не рекурсивно печатает массивы. Попробуйте прочитать количество объектов в массиве member_ids. Чудес не бывает. –

+0

Просто прочитайте один объект из mongodb и убедитесь, что его поле "members_ids" пуст. Я считаю, что это не так. –

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