Массив подсчета агрегатов 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}}}
];