Эффективное обновление записей в 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"}})