Я пытаюсь заставить MongoDB выполнить обновление нескольких записи с помощью следующего запроса, в конечном итоге с использованием MongoMapper и драйвера Mongo ruby.
db.foo.update({event_id: { $in: [1,2]}}, {$inc: {visit:1}}, true, true)
Это отлично работает, если все записи существуют, но не создает новые записи для записей, которые не существуют. Следующая команда дает желаемый эффект из оболочки , но, вероятно, не идеален для драйвера ruby.
[1,2].forEach(function(id) {db.foo.update({event_id: id}, {$inc: {visit:1}}, true, true) });
Я мог бы перебрать каждый идентификатор, который я хочу вставить, из Ruby, но это потребовало бы обращения к базе данных для каждого элемента. Есть ли способ добавить несколько элементов из драйвер ruby только с одним обращением к базе данных? Какая здесь лучшая практика? Использование mongomapper и драйвера ruby, есть ли способ отправить несколько обновлений в одном пакете, генерирует что-то вроде следующего?
db.foo.update({event_id: 1}, {$inc: {visit:1}}, true); db.foo.update({event_id: 2}, {$inc: {visit:1}}, true);
Пример данных:
Желаемые данные после команды, если существуют две записи.
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 11 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 2 }
Фактические данные после команды, если существуют две записи.
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 11 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 2 }
Желаемые данные после команды, если только запись с event_id 1 существует.
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 2 }
{ "_id" : ObjectId("4d6baf56c0d8bb8238d0209a"), "event_id" : 2, "visit" : 1 }
Фактические данные после команды, если существует только запись с event_id 1.
{ "_id" : ObjectId("4d6babbac0d8bb8238d02099"), "event_id" : 1, "visit" : 2 }