Я пытаюсь заставить MongoDB сохранить несколько записей с помощью следующего запроса, в конечном итоге используя MongoMapper и драйвер Ruby Mongo.
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 только за одну поездку в базу данных? Какова лучшая практика здесь? Используя 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 }