2013-05-22 3 views
2

У меня есть коллекция MongoDB друзей, и я запустить кодMongoDB KeyError даже если поле существует

for doc in friends.find(): 
    print doc 

я получаю:

{u'_id': ObjectId('519ccdb86383cf1444445a1c'), u'twitter_id': 609034617} 
{u'_id': ObjectId('519ccdb86383cf1444445a1d'), u'twitter_id': 253090547} 
{u'_id': ObjectId('519ccdb86383cf1444445a1e'), u'twitter_id': 146221326} 
{u'_id': ObjectId('519ccdb86383cf1444445a1f'), u'twitter_id': 1267350151} 
{u'_id': ObjectId('519ccdb86383cf1444445a20'), u'twitter_id': 8806112} 
{u'_id': ObjectId('519ccdb86383cf1444445a21'), u'twitter_id': 82589355} 

, но если я делаю:

for doc in friends.find(): 
    print doc['twitter_id'] 

I получить сообщение об ошибке:

Traceback (most recent call last): 
    File "C:\Users\schatterjee\workspace\scorefollowback.py\application.py", line 65, in  <module> 
    print doc['twitter_id'] 
KeyError: 'twitter_id' 
+0

внутри цикла, какой типа объекта является ' doc'? – dm03514

+0

@ dm03514 offcourse JSON, который находится внутри коллекции mongodb – codious

+0

Вы посмотрели? Я не думаю, что это объект JSON, это может быть словарь python. Что произойдет, если вы закроете отладчик в своем цикле и проверите каждый «doc»? Можете ли вы получить доступ к атрибутам с 'doc.twitter_id', какие данные, если они есть, находятся в' doc' в цикле? – dm03514

ответ

1

Возможно, некоторые из ваших документов не имеют идентификатора Twitter. Вот пример оболочка сеанс с хорошими данными:

>>> import pymongo 
>>> conn = pymongo.MongoClient('localhost', 27017) 
>>> users = conn['test']['users'] 
>>> users.remove() 
>>> users.insert({'twitter_id': '11111111'}) 
>>> users.insert({'twitter_id': '22222222'}) 
>>> for user in users.find(): 
    ...  print(user['twitter_id']) 
    ... 
    11111111 
    22222222 

Вы можете попробовать использовать $exists, чтобы убедиться, что поле присутствует так: Syntax: { field: { $exists: <boolean> } }

for friend in friends.find({ twitter_id: { $exists: true } }): 
    print(friend['twitter_id']) 
+0

У меня такая же проблема, я убедился, что поле существует, и если я запускаю один и тот же запрос в отдельном процессе, он не бросает эту ошибку. – Wolf7176

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