MongoDB: функция для объединения массивов - PullRequest
0 голосов
/ 29 ноября 2011

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

Я использую это в функции оболочки для объединения этих массивов:

function fixArray2() {
var counter = 0;
// I only want the xref for each field, I don't even want the id
var cursor = db.catalog.find({}, {xref: true, _id: false});

// I don't want to init this inside the loop, worried about memory leaks
var consolidatedArray = [];
while (cursor.hasNext()) {
    var xref1 = cursor.next().xref;
    // first pass: create a consolidated array when the cross references match
    var limitedCursor1 = db.catalog.find({"name":{$in:xref1}});
    while (limitedCursor1.hasNext()) {
        var doc1 = limitedCursor1.next();
        consolidatedArray = consolidatedArray.concat(doc1.xref);
    }
    consolidatedArray = consolidatedArray.unique();
    // now that we have the consolidated array, reset the xref field of the object to it
    for (var i=0; i<consolidatedArray.length; i++) {
        db.catalog.update({name:consolidatedArray[i]},{$set:{xref: consolidatedArray}},false, true);
    }

    consolidatedArray.length = 0;

    counter++;
    if (counter % 1000 == 0) {
        print("Processed " + counter + " documents.");
    }
}

}

Это работает, но мне приходится запускать его довольно часто.Кто-нибудь может предложить улучшения?

1 Ответ

1 голос
/ 30 ноября 2011

Если вы выполняете работу заранее, когда записываете документы в коллекцию, вы можете избежать этой карты - уменьшите, где вы выполняете работу позже.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...