12

これが私の問題です:

モデル:

{アプリケーション: "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の配列が非常に大きいため、日付を繰り返す必要があります。そうしないと、ドキュメントの最大制限(16MB)が取得されます。

$groupbyもできます

{年:{$ year: "$ date"}、月:{$ month: "$ date"}、日:{$ dayOfMonth: "$ date"}

ただし、ドキュメントサイズの制限もあります。

mongodbで設定されたサイズを数えることは可能ですか?

ありがとう

4

3 に答える 3

24

以下は、アプリケーションごとの 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

乾杯

于 2013-01-28T19:16:30.260 に答える
2

パーティーに少し遅れてすみません。「user_id」でグループ化し、その結果を簡単なグループでカウントするだけで問題なく機能し、ドキュメント サイズの制限に達することはありません。

[
    {$match: {application: 'abc', date: {$gte: startDate, $lte: endDate}}},
    {$unwind: '$user_id'},
    {$group: {_id: '$user_id'}},
    {$group: {_id: 'singleton', count: {$sum: 1}}}
];
于 2013-01-28T20:38:32.587 に答える