Как агрегировать по сумме результаты и группировать по заданному полю? - PullRequest
1 голос
/ 30 марта 2020

У меня есть такие документы

items = [{
        owner: [{ name: "user1" }, { name: "user2" }]
    },
    {
        owner: [{ name: "user1" }, { name: "user2" }]
    },
    {
        owner: [{ name: "user2" }, { name: "user3" }, { name: "user4" }]
    }];

Поэтому мне нужно посчитать число таких же name и сгруппировать по name и оценить их как

results = [{ name: "user2", count: 3 },
    { name: "user1", count: 2 },
    { name: "user3", count: 1 },
    { name: "user4", count: 1 }];

1 Ответ

1 голос
/ 30 марта 2020

Вы можете использовать агрегацию ниже:

db.collection.aggregate([
    {
        $unwind: "$owner"
    },
    {
        $group: {
            _id: "$owner.name",
            count: { $sum: 1 }
        }
    },
    {
        $project: {
            _id: 0,
            name: "$_id",
            count: 1
        }
    },
    {
        $sort: {
            count: -1
        }
    }
])

$ unwind можно использовать для получения одного имени на документ, тогда вам нужно $ group для подсчета и $ sort для рейтинга

Пн go Детская площадка

...