web-dev-qa-db-ja.com

MongodbAggregationカウント配列/セットサイズ

これが私の問題です:

モデル:

{アプリケーション: "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で設定されたサイズを数えることは可能ですか?

ありがとう

12
user2019059

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

乾杯

23
cubbuk

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

[
    {$match: {application: 'abc', date: {$gte: startDate, $lte: endDate}}},
    {$unwind: '$user_id'},
    {$group: {_id: '$user_id'}},
    {$group: {_id: 'singleton', count: {$sum: 1}}}
];
2
mjhm

$ 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"}
        }
    }
]
0
xiansweety