2012-01-09 15 views
1

pongongoを使用してmongoDBの行を更新しようとしています。それは実際に行を更新しないことを除いて、すべて動作しているようです!何かが欠けているのですか?(フラッシュコマンドのようなものですか?)以下のコードスニペット:pymongoの更新が機能しない

In [161]: articles = connection.journals.articles.find() 
In [162]: articles[0]['_id'] 
Out[162]: ObjectId('4ee61fc0df04c08c5c510b51') 

In [163]: articles[0]['newfield'] = 'Test' 

In [164]: connection.journals.articles.update({'_id': articles[0]['_id']}, articles[0], safe=True) 
Out[164]: 
{u'connectionId': 62, 
u'err': None, 
u'n': 1, 
u'ok': 1.0, 
u'updatedExisting': True} 

In [165]: articles = connection.journals.articles.find() 

In [166]: articles[0]['_id'] 
Out[166]: ObjectId('4ee61fc0df04c08c5c510b51') 

In [167]: articles[0]['newfield'] 
--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 

script.py in <module>() 
----> 1 
     2 
     3 
     4 
     5 

KeyError: 'newfield' 
+0

それは 'の記事を更新するように思える[0]'実際にオブジェクトを変更しません! 'article = articles [0]'でコピーを作るのは... – tdc

+1

これは 'connection.journals.articles.save(articles [0])'と思っています。 – reclosedev

答えて

1

PyMongo Cursorfind()呼び出しの結果は、実際にはリストではありません、それだけで、リストのようなアクセスをエミュレートする__getitem__を実装しています。実際には、アイテムアクセス表記を使用するたびに、探しているアイテムを返すために適切なskip()limit()が設定されたデータベースに対して新しいクエリが実行されます。だから、あなたがコメントで疑問に思ったように、articles[0]の結果を修正することはできませんが、articles[0]の結果を参照して、update()に修正して使用します。

特定の状況下では(基本的に、修正によりドキュメントが "次の"空き領域を超えて拡大した場合)、ドキュメントはMongoDBによってディスク上またはメモリ内に移動される可能性があります。 find()コールでsort()を使用していないため、結果は未定義の順序で取得されています。ドキュメントが移動すると、find()コールの結果の順序が変更されることがあります。ここで

+0

DING!それは完璧な意味がある...ありがとう! – tdc

2

あなたは何が起こっているか理解するのに役立つかもしれないいくつかのコードです:

[OK]を
# make a connection 
>>> import pymongo 
>>> articles = pymongo.Connection()['test']['articles'] 

# insert an article and print out it's contents (make sure it's there) 
>>> articles.insert({"title": "tyler's article"}) 
>>> article = articles.find_one() 
>>> article 
{u'_id': ObjectId('4f0b353c096f762312000002'), u'title': u"tyler's article"} 

# update the title to something new 
>>> article['title'] = "test" 

# save it 
>>> articles.save(article) 

# check to see if it changed 
>>> print articles.find_one() 
{u'_id': ObjectId('4f0b353c096f762312000002'), u'title': u'test'} 
関連する問題