0

私の最初の StackOverflow 投稿です。

user_sessions という名前の MongoDB コレクションがあります。単一のドキュメントは次のようになります。

{
    "_id" : ObjectId("53e352bbed3e4af00d8b459a"),
    "active_date" : 1407406779727,
    "auth_token" : "WObDF9KO6n1V34lgjlFIoXoiEmOH9CM8",
    "device_token" : "3474ac2d5aa9c7dc933bd4548c2dd6ea3d8a9592dad1c1a807c06ac2c8459205",
    "device_type" : "1",
    "end_time" : "",
    "sessionid" : "",
    "start_time" : 1407406779727,
    "userid" : "53e352bbed3e4af00d8b4599"
}

Pentaho の Report Designer (5.1) を使用してレポートを作成しようとしています。このクエリを使用して、ユーザー セッションの総数を出力できました。

[
      { $group: { _id: null, count: { $sum: 1 } } }
]

これは素晴らしいことです。

ただし、日付ごとのセッション数も表示したいと思います。

そのコレクションに対してこの PHP スクリプトを実行すると (PHP Mongo ドライバーを使用):

$connection = new Mongo("mongodb://$dbhost");
$c_us = $db->user_session;
$cursor = $c_us->find();
foreach ( $cursor as $document ) {
    echo "<br/>UserID: " . $document['userid'] . ", StartTime: ";
    $epoch = $document['start_time'];
    echo date('Y-m-d',$epoch/1000); 
}

私はこの出力を得る:

UserID: 53dfa1a7ed3e4aef0d8b456b, StartTime: 2014-08-05
UserID: 53e075deed3e4af00d8b4570, StartTime: 2014-08-05
UserID: 53e079c9ed3e4af00d8b4573, StartTime: 2014-08-05
UserID: 53e07f8ded3e4aef0d8b4580, StartTime: 2014-08-05
UserID: 53e081f9ed3e4aef0d8b4583, StartTime: 2014-08-05
UserID: 53e352bbed3e4af00d8b4599, StartTime: 2014-08-07
UserID: 53e9fb9eed3e4af00d8b45a3, StartTime: 2014-08-12
UserID: 53f215f6ed3e4aef0d8b45a3, StartTime: 2014-08-19
UserID: 53f3eeb7ed3e4aef0d8b45a7, StartTime: 2014-08-20
UserID: 54083e94ed3e4af00d8b45b0, StartTime: 2014-09-04
UserID: 5412cd29ed3e4aef0d8b45bc, StartTime: 2014-09-12
UserID: 54175625ed3e4aef0d8b45c0, StartTime: 2014-09-16
UserID: 54351b7ced3e4af00d8b45ff, StartTime: 2014-10-08
UserID: 5444f1dced3e4a56718b45bb, StartTime: 2014-10-20
UserID: 54475d48ed3e4af00d8b4628, StartTime: 2014-10-22
UserID: 5449cc77ed3e4a79638b4592, StartTime: 2014-10-24
UserID: 53e3c875ed3e4af00d8b459d, StartTime: 2014-10-24
UserID: 544f6bb7ed3e4af00d8b464a, StartTime: 2014-10-28
UserID: 544de95aed3e4a56718b45f2, StartTime: 2014-10-31
UserID: 545b125c4a4ddd30048b4567, StartTime: 2014-11-06

素晴らしい!

しかし、日付 (および月/日) ごとにセッションをカウントするにはどうすればよいですか?

したがって、上記の場合、次のようなレポートが必要です。

2014-08-05    5
2014-08-07    1
.
.
.
2014-10-24    2

Month/Year     Count
Aug 2014       9
Sep 2014       3
Oct 2014       7
Nov 2014       1

user_session スキーマが与えられた場合、start_time のエポック時間を月/年とカウントに変換するにはどうすればよいですか?

私のキーワード調査でも、試してみることができるものは何もありませんでした。

私は途方に暮れています。検索語として何を入力すればよいですか? 誰かが私にいくつかの指針を与えることができますか?

とても感謝しております。

ありがとう

ブラッド

4

1 に答える 1

0

記録のために、次のように、集計フレームワークのグループ化キーにandなどを分析するために使用できる日付集計演算子があります。$year$month$dayOfMonth

db.collection.aggregate([
   { "$group": {
       "_id": {
           "year": { "$year": "$start_time" },
           "month": { "$month": "$start_time" },
           "day": { "$dayOfMonth": "$start_time" }
       },
       "count": { "$sum": 1 }
   }}
])

しかし、「エポック タイムスタンプ」値​​に慣れている場合は、この基本的なマッチ トリックを「日付」オブジェクトと一般的な「日付計算」でいつでも使用して、必要な値に丸められたエポック タイムスタンプを生成できます。

db.collection.aggregate([
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$start_time", new Date("1970-01-01") ] },
                { "$mod": [
                     { "$subtract": [ "$start_time", new Date("1970-01-01") ] },
                     1000 * 60 * 60 * 24
                ]}
            ]
        },
        "count": { "$sum": 1 }
    }}
)

基本的なトリックでは、ある「日付」オブジェクトから別の「減算」または他の同様の計算を行うと、結果はオブジェクトからの「ミリ秒単位の差」が整数として得られます。与えられた例では、これは1 日(1000 * 60 * 60 * 24)と等しく、モジュロによって値は現在の日に丸められます。

これにより、実際に「タイムスタンプ」値​​を受け取ることが望まれる場合に、日付集計演算子に別のアプローチが提供されます。

集計パイプラインへのすべての入力は送信時に「シリアル化」されるため、ドライバーでサポートされている任意の言語のすべての有効な「dat オブジェクト」は、最終的に正しい入力値になります。ここでは、コレクションに存在する日付オブジェクト値を整数に「変換」するために「エポック」日付を使用しています。

出力として何を好むかによって異なります。新しい「日付」オブジェクトへの簡単なキャストとして「整数」形式を好む人もいます。そうするために個々のフィールドパーツに満足している人もいます.

于 2014-11-06T11:39:35.017 に答える