Как посчитать результирующие сгруппированные объекты в агрегации? - PullRequest
0 голосов
/ 20 января 2020

Умным способом. Простое задание на нумерацию страниц. У меня есть 1000 объектов, я хочу сгруппировать их и отправить в API 10 одновременно.

db.getCollection('myCollection').aggregate([
    {
        "$group": {
            "_id": {
                "name": "$name",
            },
            "count": {
                "$sum": 1
            },
            "surnames": {
                "$addToSet": "$surname"
            },
            "objects": {
                "$push": "$$ROOT"
            },
        }
    },
    {$limit:10},
    {$skip:300}
],  { allowDiskUse: true }
) 

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

$ count этап не позволит мне сохранить мои сгруппированные результаты

Выполнение этого трюка:

{$group: {_id: null, $totalCount:{$sum:1}, $results: { "$push": "$$ROOT"}}

и тогда разгруппировка разрушит мои пределы и выглядит не очень умно.

И, конечно, выполнение другой агрегации с $ count в качестве последнего этапа и без ограничений не является вариантом. Из-за скорости.

Буду рад любому совету.

1 Ответ

0 голосов
/ 20 января 2020

Сначала я думаю, что вам нужно изменить положение ваших $limit и $skip ступеней.

Поскольку ваша группировка по name вы можете использовать Mon go ' отдельный в этом поле и проверьте length массива, например:

let names = await db.collection.distinct("name");
let totalLength = names.length - 300;
...