0

そのため、アプリへのログオンを追跡するMongoDBドキュメントがあります。基本的な構造は次のようになります。

 [_id] => MongoId Object
        (
            [$id] => 50f6da28686ba94b49000003
        )

    [userId] => 50ef542a686ba95971000004
    [action] => login
    [time] => 1358354984

さて、課題はこれです:これらのエントリは約20,000あります。各ユーザーがログインした回数(userIdで定義)を確認するように求められました...そのため、これを行うための良い方法を探しています。私が見たいくつかの可能なアプローチがあります(たとえば、SQLでは、UserIDでグループ化し、それをカウントすることでログイン数を減らすことができます-SELECT userID、count(*)from ... .group by UserId ...そしてその上でサブ選択(CASE WHENまたはトップセレクトの何か)とにかく-これを行うための最良の方法について誰かが何か提案があるかどうか疑問に思います。最悪のシナリオ私は結果セットを制限することができますそして、メモリ内でグループ化を行いますが、理想的には、Mongoから直接完全な回答を取得したいと考えています。他の制限(最初のセットを通過した後でも)は、日付ごとに一意のカウントを実行しようとしていることです...

4

3 に答える 3

2

ここでの課題は次のとおりです。これらのエントリは約 20,000 あります。

20,000 では、集約フレームワーク ( http://docs.mongodb.org/manual/applications/aggregation/ )を使用したほうがよいでしょう。

$db->user->aggregate(array(
    array( '$group' => array( '_id' => '$userId', 'num_logins' => array( '$sum' => 1 ) ) )
));

グループ化 ( http://docs.mongodb.org/manual/reference/aggregation/#_S_group ) しuserId、カウント (合計: http://docs.mongodb.org/manual/reference/aggregation/sum/#_S_sum )グループ化されたログインの量。

注: コメントに記載されているように、集計ヘルパーは PHP ドライバーのバージョン 1.3+ にあります。commandバージョン 1.3 より前では、関数を直接使用する必要があります。

于 2013-01-31T19:29:44.950 に答える
0

MapReduceを使用して、ユーザーIDで結果をグループ化できます

http://docs.mongodb.org/manual/applications/map-reduce/#map-reduce-examples

または、グループ方式を使用できます。

db.logins.aggregate(
    { $group : {
        _id : "$userId",
        loginsPerUser : { $sum : 1 }
    }}
);

MongoDB 20K以上の場合、それらを歩いて組み合わせるのに問題はないので、パフォーマンスについて心配する必要はありません。

于 2013-01-31T19:25:23.403 に答える
0

http://docs.mongodb.org/manual/reference/command/group/

db.user.group({key: {userId: 1}, $reduce: function ( curr, result ) { result.total++ }, initial: {total: 0}});

わずか数秒で 191000 行でこれを実行しましたが、グループは 20,000 の一意のエントリに制限されているため、実際には解決策ではありません。

于 2013-01-31T19:35:00.170 に答える