обновление pymongo не работает - PullRequest
1 голос
/ 09 января 2012

Я пытаюсь обновить строку в 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'

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Вот код, который может помочь вам понять, что происходит:

# 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'}
1 голос
/ 09 января 2012

A PyMongo Cursor , результат вызова find(), на самом деле не список, он просто реализует __getitem__ для эмуляции доступа, подобного списку. Фактически, каждый раз, когда вы используете нотацию доступа к элементу, он выполняет новый запрос к базе данных с соответствующими установленными skip() и limit(), чтобы вернуть искомый элемент. Таким образом, как вы и подозревали в комментариях, изменение результата articles[0] не сработает, но создание ссылки на результат articles[0] с последующим изменением и использованием этого в update() будет работать.

Вы также должны знать, что при определенных обстоятельствах (в основном, если модификация приводит к тому, что документ выходит за пределы свободного пространства, доступного «рядом» с ним), документ может быть перемещен на диск / в память MongoDB. Поскольку вы не используете sort() в своем вызове find(), вы получаете результаты в неопределенном порядке. При перемещении документов порядок результатов в вызове find() может измениться, если документы были перемещены.

...