Эффективное обновление записей в MongoDB / pymongo (возможно, на месте?)

Я обновляю записи в моей коллекции следующим образом:

for document in myDB.find():
    if compliesToSomeRule(document):
        myDB.update({'_id':document['_id']}, {'$set':{'something':'somevalue'}})

Это самый эффективный способ сделать это?

Просто кажется странным, что я должен установить первый параметр обновления как _id документа, так как это запрос индекса?

Есть ли способ обновить "на месте", так сказать?

4 ответа

Первый раздел команды обновления, который вы делаете, по сути, то, что вы хотите от метода "compliesToSomeRule". Например, допустим, что compliesToSomeRule определяется следующим образом:

def compliesToSomeResult(doc):
    if doc['a'] == 0:
        return True
    else:
        return False

Тогда вы можете пропустить этот набор и просто сделать

myDB.update({ 'a' : 0 }, {'$set' : { 'x' : 'y' }})

Затем ваш документ обновления (второй) будет применен ко всем документам в вашей коллекции, которые имеют поле, равное 0.

Другой пример: если вы хотите найти все документы, где "а"> 0, вы можете сделать

myDB.update({ 'a' : { '$gt' : 0 }}, {'$set' : {'x' : 'y'}})

В первом разделе вызова обновления, разделе "запрос", указывается, какие документы получают обновление. Второй раздел определяет, что на самом деле является обновление.

Вот документ, который вам может пригодиться при просмотре этого материала: http://docs.mongodb.org/manual/applications/update/

Я думаю, что вы хотите посмотреть на ключевое слово "$ где". http://docs.mongodb.org/manual/reference/operator/where/ Он позволяет выполнять запросы на основе функции javascript, поэтому все происходит в базе данных. Это может быть медленнее, хотя.

Вы обновляете на месте. Первым аргументом для обновления является предложение find, и именно так оно определяет, какую запись обновить.

редактировать

MongoDB обрабатывает кеширование? Да. MongoDB хранит все последние использованные данные в оперативной памяти. Если вы создали индексы для своих запросов и ваш рабочий набор данных помещается в ОЗУ, MongoDB обслуживает все запросы из памяти.

MongoDB не реализует кэш запросов: MongoDB обслуживает все запросы непосредственно из индексов и / или файлов данных.


Кроме того, ваше имя пользователя потрясающе:)

Если вам нужно найти конкретный документ, а затем добавить что-то:

    flag=db.foo.find({"_id":333})
    try: 
        if flag[0]['_id']:
            db.foo.update({"_id":333},{"$set":{"name":"mongo"}})
    except:
        print "none"

но если вам нужно найти все документы и добавить что-то ко всем:

flag=db.foo.find()
for row in flag:
    db.foo.update({"_id":flag['_id']},{"$set":{"name":"mongo"}})
Другие вопросы по тегам