2016-02-18 2 views
3

Я хочу обновить тысячи документов в коллекции mongo. Я хочу найти их с помощью ObjectId, а затем, какой бы ни был документ, должен быть обновлен. Мое обновление одинаково для всех документов. У меня есть список ObjectId. Для каждого ObjectId в списке, Монго должны найти соответствующий документ и обновить «isBad» ключ этого документа «N»Массовое обновление в Pymongo с использованием нескольких ObjectId

ids = [ObjectId('56ac9d3fa722f1029b75b128'), ObjectId('56ac8961a722f10249ad0ad1')] 
bulk = db.testdata.initialize_unordered_bulk_op() 
bulk.find({ '_id': ids}).update({ '$set': { "isBad" : "N" } }) 
print bulk.execute() 

Это дает мне результат:

{'nModified': 0, 'nUpserted': 0, 'nMatched': 0, 'writeErrors': [], 'upserted': [], 'writeConcernErrors': [], 'nRemoved': 0, 'nInserted': 0} 

Это, как ожидается, потому что он пытается для соответствия «_id» со списком. Но я не знаю, как действовать.

Я знаю, как обновлять каждый документ по отдельности. Мой размер списка составляет порядка 25000. Я не хочу делать 25000 звонков индивидуально. Количество документов в моей коллекции намного больше. Я использую python2, pymongo = 3.2.1.

ответ

-1

я получил ответ, это может быть сделано, как это:

bulk = db.testdata.initialize_unordered_bulk_op() 
    for i in range (0, len(ids)): 
     bulk.find({ '_id': ids[i]}).update({ '$set': { "isBad" : "N" }}) 
    print bulk.execute() 
+1

Почему вам нужно 'range' this неэффективен. – styvane

6

Итерации по списку идентификаторов, используя для цикла и отправлять объемные обновления в пакетах 500:

bulk = db.testdata.initialize_unordered_bulk_op() 
counter = 0 

for id in ids: 
    # process in bulk 
    bulk.find({ '_id': id }).update({ '$set': { 'isBad': 'N' } }) 
    counter += 1 

    if (counter % 500 == 0): 
     bulk.execute() 
     bulk = db.testdata.initialize_ordered_bulk_op() 

if (counter % 500 != 0): 
    bulk.execute() 

Поскольку команда записи не могут принимать не более 1000 операций (от docs) , вам придется разделить объемные операции на несколько партий, в этом случае вы можете выбрать произвольный размер партии до 1000.

Причина выбора 500 заключается в обеспечении того, чтобы сумма соответствующего документа из документа Bulk.find(), а документ обновления меньше или равен максимальному размеру документа BSON, даже если нет никакой гарантии, что использование 1000 запросов по умолчанию будет соответствовать пределу BSON 16 МБ. Операции в оболочке монго и сопоставимые методы в драйверах не имеют этого ограничения.

+0

почему ограничить до 500? –

+0

@PratikGujarathi Добавлен readon для выбора. – chridam

+1

'count ++' будет терпеть неудачу в использовании Python 'count = count + 1' или' count + = 1' – styvane

 Смежные вопросы

  • Нет связанных вопросов^_^