Возврат количества с данными в агрегации MongoDB - PullRequest
1 голос
/ 21 сентября 2019

Я написал запрос агрегации MongoDB, который использует несколько этапов.В конце я хотел бы, чтобы запрос возвратил мои данные в следующем формате:

{
    data: // Array of the matching documents here
    count: // The total count of all the documents, including those that are skipped and limited.
}

Я собираюсь использовать функции пропуска и ограничения, чтобы в конечном итоге сократить результаты.Тем не менее, я хотел бы знать количество документов, возвращаемых до Я пропускаю и ограничиваю их.Предположительно, этап конвейера должен был бы произойти где-то после этапа $match, но до этапов $skip и $limit.

Вот запрос, который я сейчас написал (он находится в маршруте express.jsВот почему я использую так много переменных:

const { 
    minDate, 
    maxDate,
    filter,  // Text to search
    filterTarget, // Row to search for text
    sortBy, // Row to sort by
    sortOrder, // 1 or -1
    skip, // rowsPerPage * pageNumber
    rowsPerPage, // Limit value
} = req.query;



db[source].aggregate([
        {
            $match: { 
                date: {
                    $gt: minDate, // Filter out by time frame...
                    $lt: maxDate
                }
            }
        },
        {
            $match: { 
                [filterTarget]: searchTerm // Match search query....
            }
        },
        {
            $sort: {
                [sortBy]: sortOrder // Sort by date...
            }
        },
        {
            $skip: skip // Skip the first X number of doucuments...
        },
        {
            $limit: rowsPerPage
        },
]);

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Мы можем использовать фасет для запуска параллельных конвейеров данных и затем объединить выходные данные каждого конвейера.

Ниже приведен обновленный запрос:

db[source].aggregate([
    {
        $match: { 
            date: {
                $gt: minDate, // Filter out by time frame...
                $lt: maxDate
            }
        }
    },
    {
        $match: { 
            [filterTarget]: searchTerm // Match search query....
        }
    },
    {
        $set: {
            [filterTarget]: { $toLower: `$${filterTarget}` } // Necessary to ensure that sort works properly...
        }
    },
    {
        $sort: {
            [sortBy]: sortOrder // Sort by date...
        }
    },
    {
        $facet:{
            "data":[
                {
                    $skip: skip
                },  
                {
                    $limit:rowsPerPage
                }
            ],
            "info":[
                {
                    $count:"count"
                }
            ]
        }
    },
    {
        $project:{
            "_id":0,
            "data":1,
            "count":{
                $let:{
                    "vars":{
                        "elem":{
                            $arrayElemAt:["$info",0]
                        }
                    },
                    "in":{
                        $trunc:"$$elem.count"
                    }
                }
            }
        }
    }
]).pretty()
0 голосов
/ 21 сентября 2019

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

Это добавить $group этап, пропуская null в качествезначение, затем помещая каждый документ $$ROOT в массив данных, и для каждого увеличивая счет на 1 с помощью оператора $sum.

Затем на следующем этапе $project я простоудалите свойство _id и нарежьте массив.

db[source].aggregate([
        {
            $match: { 
                date: {
                    $gt: minDate, // Filter out by time frame...
                    $lt: maxDate
                }
            }
        },
        {
            $match: { 
                [filterTarget]: searchTerm // Match search query....
            }
        },
        {
            $set: {
                [filterTarget]: { $toLower: `$${filterTarget}` } // Necessary to ensure that sort works properly...
            }
        },
        {
            $sort: {
                [sortBy]: sortOrder // Sort by date...
            }
        },
        {
            $group: { 
                _id: null,
                data: { $push: "$$ROOT" }, // Push each document into the data array.
                count: { $sum: 1 }
            }
        },
        {
            $project: {
                _id: 0,
                count: 1,
                data: { 
                    $slice: ["$data", skip, rowsPerPage]
                },

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