2016-04-06 3 views
2

Возможно ли обновление коллекции A с использованием данных из коллекции B?Объединение коллекций с использованием обновления

background: Целью этого является обход недостатка надлежащей атомарности мангодба. Я просматриваю некоторые данные журнала для создания агрегатов данных и хочу знать, что данные соответствуют тому, что было предложено для ввода. Вместо того, чтобы делать two phase commit, я хотел бы создать пакетную запись в холдинг-коллекцию. Когда сбор завершен (например, после 10000 записей или всего прочитанного файла), количество документов из базы данных сравнивается с количеством, которое сгенерировано приложением, если оно соответствует, обновляет большую коллекцию с помощью временной коллекции , В начале следующего импорта очистите временную коллекцию. Таким образом, если процесс будет прерван в любое время, вероятность его возникновения на этапе обновления будет меньше, и любая ошибка во время временной коллекции будет автоматически исправлена ​​путем очистки временных данных и перезапуска процесса при следующем запуске.

Возможно ли обновить основную коллекцию, используя данные временной коллекции? Является ли такое обновление значительно быстрее, чем отдельные обновления из приложения?


обновление: данных выглядит следующим образом (ниже) в обоих сборниках. Я собираюсь объединить записи, которые найдут соответствующий документ на основе event и month, или создадим новый, если он не существует. он будет принимать ежедневные цифры и увеличивать их. Идея состоит в том, что процесс, который обновляет подсчеты во временном собрании, обновляется один раз на запись, поэтому каждый ежедневный счет - одна запись. Когда я закончил партию, я хотел бы обновить основную коллекцию содержимым временной коллекции, используя одну команду mongodb.

{ 
    "event": "abc", 
    "month": "2012-04", 
    "daily": { 
     "1": 82, 
     "2": 6, 
     "3": 12, 
     "4": 23, 
     "5": 62, 
     ... 
    } 
} 
+0

Вы хотите обновить или добавить новые документы? Не могли бы вы привести пример двух коллекций и как должен выглядеть конечный продукт? – BanksySan

+0

Я обновил вопрос – Daniel

ответ

2

Вот вам бросок от нуба.

Из информации, полученной от вашего вопроса. Я бы использовал цикл JS для этого.

Вот что можно использовать в качестве источника.

db.collection_a.find().batchSize(10000).forEach(function(doc){ 

    result = db.collection_b.findOne({'column_b': doc['column_a']}); 

    if (result != null){ 
     db.collection_a.update({'_id': doc['_id']},{ 
      $set:{ 
      'new_column_a': result['column_b'] 
     } 
    })} 

    else { 
    print('Not found ' + doc['column_a']) 
} 
}); 

BATCHSIZE может быть изменен в первой функции.

  • Первая функция ищет каждый набор данных.
  • Вторая функция ищет соответствующие наборы данных из каждой коллекции.

Тогда _id будет обновляться. Наконец-то новый столбец добавлен в коллекцию_a. Данные извлекаются из коллекции b.

+0

, будет ли это js работать внутри mongodb, или нужно запустить извне? – Daniel

+0

Вы можете запустить это внутри (копировать-вставить). Или вы можете вызвать его из внешнего файла. Вам решать. –

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