これが私の問題です:
モデル:
{アプリケーション: "abc"、日付:Time.now、ステータス: "1" user_id:[id1、id2、id4]}
{アプリケーション: "abc"、日付:Time.yesterday、ステータス: "1"、user_id:[id1、id3、id5]}
{アプリケーション: "abc"、日付:Time.yesterday-1、ステータス: "1"、user_id:[id1、id3、id5]}
一定期間内のuser_idの一意の数を数える必要があります。
期待される結果:
{アプリケーション: "abc"、ステータス: "1"、unique_id_count:5}
私は現在、集約フレームワークを使用しており、mongodbの外部のIDをカウントしています。
{$ match:{application: "abc"}}、{$ unwind: "$ users"}、{$ group:{_ id:{status: "$ status"}、users:{$ addToSet: "$ users"} }}
ユーザーIDの配列が非常に大きいため、日付を繰り返す必要があります。そうしないと、ドキュメントの最大制限(16 MB)が取得されます。
$ groupbyもできます
{年:{$ year: "$ date"}、月:{$ month: "$ date"}、日:{$ dayOfMonth: "$ date"}
ただし、ドキュメントサイズの制限もあります。
Mongodbで設定されたサイズを数えることは可能ですか?
ありがとう
以下は、アプリケーションごとのuniqueUsersの数を返します。これにより、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
乾杯
すみません、パーティーに少し遅れました。 'user_id'でグループ化し、簡単なグループで結果をカウントするだけで問題なく機能し、ドキュメントのサイズ制限にぶつかることはありません。
[
{$match: {application: 'abc', date: {$gte: startDate, $lte: endDate}}},
{$unwind: '$user_id'},
{$group: {_id: '$user_id'}},
{$group: {_id: 'singleton', count: {$sum: 1}}}
];
$ sizeを使用して、セットのサイズを取得します。
[
{
$match: {"application": "abc"}
},
{
$unwind: "$user_id"
},
{
$group: {
"_id": "$status",
"application": "$application",
"unique_user_id": {$addToSet: "$user_id"}
}
},
{
$project:{
"_id": "$_id",
"application": "$application",
"count": {$size: "$unique_user_id"}
}
}
]