Загрузка документов из azure cosmosDB очень медленная в javascript - PullRequest
0 голосов
/ 23 апреля 2020

Я использую конвейер агрегации для извлечения документов из azure cosmosDB, который использует API Mon go. Есть два этапа: сначала получить документы из cosmosdb, который возвращает курсор mon go, а затем выполнить итерацию курсора для преобразования его в массив в javascript. Я обнаружил, что преобразование в массив занимает намного больше времени, чем выборка документа в качестве курсора.

Я пробовал 3 различными способами:

Первый метод:

collection.aggregate () .filter (). toArray (), где collection.aggregate (). filter () возвращает курсор mon go, а затем toArray () преобразует его в массив.

Этот метод занял 286000 мс ( 4,8 мин).

Второй метод:

Я разделил агрегацию и преобразование в функции массива.

collection.aggregate () занял 2 мс, а cursor.toArray () занял 266000 мс. Таким образом, этот метод занял в общей сложности 4,5 минуты.

Третий метод:

Вместо cursor.toArray () я использовал cursor.forEach () и cursor.map () для итерации документы в курсоре и затем javascript pu sh () для помещения их в массив.

collection.aggregate () заняло 2 мс, в то время как cursor.forEach (), cursor.map () и pu sh () заняло 84000 мс. Этот метод занял всего 1,4 минуты, поэтому время значительно сокращается по сравнению с первыми двумя методами.

Но мне нужно еще больше сократить время, поскольку 1,4 минуты все еще медленны.

Агрегация Конвейер объединяет результаты из 3 различных коллекций в базе данных. Коллекция_1 содержит 156951 документов, коллекция_2 содержит 416218 документов, а коллекция_3 содержит 1261792 документа. Для этого примера агрегация возвращает курсор, содержащий 6 документов, которые затем преобразуются в массив.

Ниже приведен код конвейера агрегации и метод toArray

            let resultsArray = [];
    const cursor = await collection_1.aggregate([
        {
            $match: {
                <id query>,

            }
        },
        {
            $lookup: {
                from: collection_2,
                localField: <>,
                foreignField: <>,
                as: 'results'
            }
        },
        {
            $unwind: {
                path: '$results'
            }
        },
        {
            $replaceRoot: {
                newRoot: {
                    $mergeObjects: [
                        "$$ROOT",
                        "$results",
                    ]
                }
            }
        },
        {
            $project: {
                results: 0
            }
        },
        {
            $match: {
                <id query>,
            }
        },
        resultsQ.options.sort
            ? {
                $sort: resultsQ.options.sort
            }
            : undefined,
        {
            $skip
        },
        {
            $limit: $limit + 1
        },
        {
            $project: {
                <document field parameter>: 0,


            }
        },
        {
            $lookup: {
                from: collection_3,
                localField: <>,
                foreignField: <>,
                as: 'results2'
            }
        },
        {
            $unwind: {
                path: '$results2'
            }
        },
        {
            $project: {
                       <document field parameter>: 0,
            }
        }
    ].filter(s => s)).

  resultsArray = cursor.toArray());

Ниже приводится код для курсора для функций forEach (), map () (это заменяет курсор на функцию Array (), показанную выше):

    const analysis = await cursor.forEach( function(firstDoc)
    {  
        resultsArray.push(firstDoc);
        cursor.map( function(doc) 
        {
            resultsArray.push(doc);
        } );
    });

(просто чтобы вы знали, что выше мне нужно сделать pu sh первый документ отдельно, потому что функция map () пропускает первый документ, но это не проблема)

Так что возможно еще больше сократить время как в конвейере агрегации, так и при преобразовании курсора в javascript массив?

Большое спасибо.

...