MongoDB Aggregate - подсчитывать объекты определенного совпадающего поля - PullRequest
1 голос
/ 12 апреля 2019

Я хочу знать, как использовать aggregate (), чтобы взять все объекты определенного поля (т. Е. "Пользователь") и сосчитать их.

Вот что я делаю:

Я хочу вернуть список пользователей с суммой, сколько созданных твитов?

Итак, я хочу вывод, который выглядит как

Etc ..

Также я не хочу повторять таких пользователей, как

Etc ..

что и делает вышеуказанный агрегат.

Так в принципе, как я могу изменить этот агрегат, чтобы гарантировать уникальность объектов?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Полагаю, вы захотите сгруппировать по полю user.id вместо объекта user.Вы можете попробовать сделать это напрямую

$group: {_id: "$user.id", totalTweets: {$sum: 1} }

Или вы можете попробовать проецировать это поле на документ перед группировкой

$addFields: {userId: "$user.id"}
$group: {_id: "$userId", totalTweets: {$sum: 1} }
0 голосов
/ 13 апреля 2019

Если вы хотите, чтобы весь внутренний пользовательский объект в каждом документе после агрегирования, тогда вы должны использовать оператор $push в агрегации а также вам нужно выполнить агрегацию по уникальному идентификатору пользователей, например: id или id_str вместо $user объекта, как в вашем вопросе.

db.tweets.aggregate([{ $group: {_id: "$user.id", totalTweets: { $sum: 1 }, user : { $push: "$user" }  }    }])

Это решит вашу проблему. Подробнее об операторе $push см. В официальных документах $ push

...