PyMongo и Mongodb: использование update()

Я пытаюсь использовать pymongo для обновления существующего индекса:

#!/usr/bin/env python

import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.alfmonitor
tests = db.tests

post = {
    'name' : 'Blah',
    'active' : True,
    'url' : 'http://www.google.com',
}

tests.insert(post)

tests_list = db.tests.find({'active':True, 'name':'Blah'})
for test in tests_list:
    test['active'] = False
    test.update(
        test,
    )

print '===================================================='

for test in db.tests.find():
    print test #<- when I print out these, active=True is still showing up

Я пытался следовать документации и примерам, которые я видел на SO, но ни один из них, похоже, не работает для меня. Кто-нибудь может объяснить, что я делаю неправильно здесь?

Спасибо!


person Harlin    schedule 06.04.2014    source источник


Ответы (3)


Используйте это (не забудьте добавить multi=True, если хотите обновить все совпадения):

db.tests.update({'active':True, 'name':'Blah'}, {'$set': {'active': False}}, multi=True)

Почему ваш код не работает:

for test in tests_list:
    # test is of a dict type
    test['active'] = False
    # You are calling the method of dict type
    # that adds all values from dictionary test to dictionary test,
    # so nothing goes to database
    test.update(
        test,
    )
person vaultah    schedule 06.04.2014
comment
Когда я попробовал это, я получил: {u'active': False, u'url': u'google.com', u'_id': ObjectId('53417509399f808d4929697e'), u'name': u'Blah'} {u'active': True, u'url': u'google.com', u'_id': ObjectId('53417552399f808d55c4e74b'), u'name': u'Blah'} Не похоже, обновление всех из них, которые соответствуют запросу. - person Harlin; 06.04.2014
comment
Все еще получаю то же самое. - person Harlin; 06.04.2014
comment
@jnoob ты не указал multi=True - person vaultah; 06.04.2014
comment
Эй, Traceur, multi=True сделал свое дело :) Большое спасибо за объяснение и терпение :) - person Harlin; 06.04.2014
comment
@jnoob Нет проблем :). Вы также должны принять ответ, если сочтете его полезным и исчерпывающим. Вот как это сделать. - person vaultah; 06.04.2014

Если вы хотите зафиксировать изменения, внесенные в полученный документ, используйте collection.save вместо update:

test['active'] = False
db.tests.save(test)
person JohnnyHK    schedule 06.04.2014
comment
Если я использую это, где я могу изменить «активный» с «Истина» на «Ложь»? - person Harlin; 06.04.2014
comment
Это работает, когда вы делаете: test_list = db.tests.find({'active':True, 'name':'Blah'}) для теста в test_list: test['active'] = False db.tests.save( test) Большое спасибо за помощь и в этом :) - person Harlin; 06.04.2014

Оба они работали для меня:

db.tests.update(
    {'active':True, 'name':'Blah'}, 
    {
        '$set': {'active': False}
    },
    multi=True
)


tests_list = db.tests.find({'active':True, 'name':'Blah'})
for test in tests_list:
    test['active'] = False
    db.tests.save(test)

Большое спасибо traceur и JonnyHK!

person Harlin    schedule 06.04.2014