Meteor.js: массовое / пакетное обновление MongoDB

Я рыскал по Интернету несколько часов, чтобы найти решение, в котором выполнение массовых upserts в умных коллекциях Meteor.js является эффективным.

Сценарий:

Я нажимаю api, чтобы асинхронно получать обновленную информацию для 200 свойств каждые 12 часов. Для каждого свойства я получаю в среднем около 300 объектов JSON. 70% объектов могли не обновляться. Но для остальных 30% объектов мне нужно обновить их в базе данных. Поскольку невозможно найти эти 30% объектов, не сопоставив их с документами в базе данных, я решил обновить все документы.

Мои варианты:

  1. Выполните цикл по массиву объектов и вставьте каждый документ в базу данных.
  2. Удалите все документы из коллекции и массово вставьте новые объекты.

Для варианта 1 запуск цикла и загрузка 60К документов (которые со временем будут увеличиваться) занимает много времени. Но на данный момент кажется единственным правдоподобным вариантом.

Для варианта 2 meteor.js не допускает массовую вставку в свои смарт-коллекции. Даже для этого нам придется перебирать массив объектов.

Есть ли другой вариант, где я могу добиться этого эффективно?


person Jehanzeb.Malik    schedule 28.05.2014    source источник


Ответы (2)


MongoDb поддерживает вставку массива документов. Таким образом, вы можете вставить все свои документы за один вызов из Meteors 'rawCollection'.

MyCollection.remove({}); // its empty

var theRaw = MyCollection.rawCollection();
var mongoInsertSync = Meteor.wrapAsync(theRaw.insert, theRaw);
var result = mongoInsertSync(theArrayOfDocs);

В производственном коде вы оберните это в try / catch, чтобы уловить ошибку, если ваша вставка не удалась, результат хорош только в том случае, если вставка массива документов прошла успешно.

person Pablo    schedule 30.05.2015

Вышеупомянутое решение с rawCollection действительно вставляет, но, похоже, не поддерживает директиву order: false для продолжения обработки в случае сбоя одного документа, необработанная коллекция завершается при первой ошибке, что прискорбно.

«Если false, выполнить неупорядоченную вставку, а в случае ошибки с одним из документов продолжить обработку остальных документов в массиве».

person aloharich    schedule 14.07.2015