Массив подсчета агрегатов Mongodb/заданный размер
Здесь моя проблема:
Модель:
{application: "abc" , date: Time.now, status: "1" user_id: [id1, id2, id4]}
{application: "abc" , date: Time.yesterday, status: "1", user_id: [ id1, id3, id5]}
{application: "abc" , date: Time.yesterday-1, status: "1", user_id: [ id1, id3, id5]}
Мне нужно подсчитать уникальное количество user_id за определенный промежуток времени.
Ожидаемый результат:
{application: "abc" , статус: "1", unique_id_count: 5}
В настоящее время я использую структуру агрегации и подсчитываю идентификаторы за пределами mongodb.
{$ match: {application: "abc" }}, {$ unwind: "$ users" }, {$ group: {_id: {статус: "$ status" }, пользователей: {$ addToSet: "$ users" }}}
Мои массивы идентификаторов пользователей очень велики, поэтому мне нужно итерировать даты, или я получу максимальный лимит документа (16 Мб).
Я мог бы также $group
{year: {$ year: "$ date" }, месяц: {$ month: "$ date" }, день: { $dayOfMonth: "$ date" }
но я также получаю ограничение размера документа.
Можно ли подсчитать размер набора в mongodb?
спасибо
Ответы
Ответ 1
Ниже приводится количество уникальных пользователей для каждого приложения. Это применит групповую операцию к результату групповой операции, используя функцию конвейера mongodb.
{ $match: { application: "abc" } },
{ $unwind: "$users" },
{ $group: { _id: "$status", users: { $addToSet: "$users" } } },
{ $unwind:"$users" },
{ $group : {_id : "$_id", count : {$sum : 1} } }
Надеюсь, это будет сделано более простым способом в следующих выпусках mongo командой, которая дает размер массива под проекцией. {$project: {id: "$_id", count: {$size: "$uniqueUsers"}}}
https://jira.mongodb.org/browse/SERVER-4899
Приветствия
Ответ 2
Жаль, что я немного опаздываю на вечеринку. Простое группирование по "user_id" и подсчет результата с помощью тривиальной группы отлично работают и не работают с ограничениями размера документа.
[
{$match: {application: 'abc', date: {$gte: startDate, $lte: endDate}}},
{$unwind: '$user_id'},
{$group: {_id: '$user_id'}},
{$group: {_id: 'singleton', count: {$sum: 1}}}
];