2016-05-30 2 views
1

Считайте, что у нас есть повышение зарплаты для всех сотрудников, где повышение зарплаты не привязано ко всем людям, и это зависит от некоторых полей в одном документе с сотрудниками, как я могу обновить все зарплаты до документов mongo (по одному на каждого сотрудника) с одной командой?Как обновить несколько документов в MongoDB с одинаковыми критериями обновления в одной команде?

Update

Рассмотрим У меня есть идентификатор служащего или имя, а также обновления заработной платы, и хотите обновить все документы, с помощью одной команды

Образцы документов

{ _id: "11111", заработная плата: (metric_1/metric_2), название: "Androw", metric_1: 12345, metric_2: 222,
... }

{ _id: "22222", зарплата: (metric_1/metric_2), название: "Джон", metric_1: 999, metric_2: 223, ... }

где metric_1 и metric_2 являются случайными факторами, связанными с пользовательскими взаимодействиями, а заработная плата является их функцией.

+0

Существует множество способов сделать такие обновления. Однако, для четкого решения, пожалуйста, обновите сообщение вместе с некоторой типовой структурой документа. Для справки см. Http://stackoverflow.com/help/mcve – Saleem

+0

@Saleem, Спасибо за ваш комментарий. Сообщение обновлено. – securecurve

+0

Каковы критерии повышения стоимости. Как зарплата 100 натолкнулась на 300? Любая математическая формула? Любой процент? – Saleem

ответ

0

Следующая команда работы велик, и может сделать необходимую операцию по мере необходимости, принимая во внимание у вас есть список идентификаторов или имен, которые вы хотите обновить пользователей (может быть все)

db.salaries.aggregate([ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]} } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } , {$out:"new_salaries"} ]) 

Обратной из выше команда состоит в том, что вам нужно иметь новую коллекцию для вставки новых обновленных полей, а если имя существующей коллекции (в этом случае зарплата), она удалит все существующие поля и просто добавит недавно вычисленные документы, что небезопасно для так как другие операции могли произойти во время нового расчета зарплаты.

Лучше подход

Лучше всего делать это, чтобы объединить агрегации конвейерные с объемными операциями Монго, чтобы сделать пакетное обновление нашей коллекции, выходящей. Таким образом:

var salaries_to_update = db.salaries.aggregate([ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]} } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } ]) 

Затем мы делаем объемную операцию обновления, которая делает пакет обновлений сразу без много обработки и движения головной боли и обратно.

var bulk = db.salaries.initializeUnorderedBulkOp() 

salaries_to_update.forEach(salary){ 
    bulk.find(_id: salary._id).updateOne({$set:{salary:salary.salary}}) 
} 

bulk.execute() 

упорядоченные массовые операции выполняются в порядке (отсюда название), Остановки, когда есть ошибка.

Ненумерованные массовые операции выполняются в произвольном порядке (потенциально параллельно), и эти операции не останавливается, когда возникает ошибка.

Таким образом, здесь мы используем неупорядоченное массовое обновление.

Это все

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