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': Вярно, 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
Ако използвам това, къде да му кажа да промени „активен“ от True на False? - person Harlin; 06.04.2014
comment
Това работи, когато го направите: tests_list = db.tests.find({'active':True, 'name':'Blah'}) за тест в tests_list: test['active'] = False db.tests.save( тест) Благодаря много за помощта и за този :) - 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