2012-01-20 14 views
2

私はMongoでいくつかのテストをしようとしていますが、私は単純なMySQLクエリのいくつかがMongoに相当すると考えています。MongoDB - MySQL SUM(CASE WHEN)相当ですか?

は、私はあなたがモンゴ文書のキーに詳細を打破しようとする必要がありますように私はここにRuduに同意するだろう、私は助けが必要もう少し複雑です。このクエリ...

SELECT DISTINCT dims_user, 
    COUNT(DISTINCT asset_name) AS asset_count, 
    COUNT(DISTINCT system_name) AS station_count, 
    SUM(CASE WHEN details ='viewed' then 1 Else 0 end) AS viewed_count, 
    SUM(CASE WHEN details Like 'Viewed Web%' then 1 Else 0 end) AS Web_count, 
    SUM(CASE WHEN details = 'ThumbView' then 1 Else 0 end) AS ThumbView_count, 
    SUM(CASE WHEN details Like 'Exported%' then 1 Else 0 end) AS Exported_count, 
    SUM(CASE WHEN details Like '%Print%' then 1 Else 0 end) AS Printed_count 
FROM asset_log GROUP BY dims_user; 
+1

Uh ...これは良い関係の習慣ではありません...「詳細」列のデータを正規化する必要があります.NoSQLのdbデザインの列も同じです:action =(view | web | thumb | export | print)したら、アクションごとにグループに切り替えるだけです。 – Rudu

+0

ログファイルの束、私はちょうどそこに3200万レコードを持っています – rreeves

+2

[ETL](http://en.wikipedia.org/wiki/Extract,_transform,_load)それは一度静的な - または繰返し負荷のための負荷/変換処理)を正規化する。それはあなたがしようとしていることを大幅に簡素化します。 – Rudu

答えて

1

を持っています。

文書は次のようにオブジェクトが含まれる可能性があります:あなたは、データを再構築していない場合は

details: 
{ 
    viewed: true 
    thumb_view: true 
    web_viewed: false 
    exported: true 
    ... 
} 

、クエリは、MongoDBののインデックス機能を使用することができない非根ざした正規表現が必要になります。

ただし、これを行うかどうかにかかわらず、map reduceを使用したい場合があります。マップ中の詳細を含むアイテムを出力することができます(正規表現で処理するか、単純に再構成された形式でキーを発行するかのいずれかによって)、それらを還元フェーズで合計します。

あなたはこのリンクdocs

1

アウトでそれについての詳細を読むことができる、それが役立つことがあります。

http://www.kchodorow.com/blog/2011/12/09/sql-to-mongodb-an-updated-mapping/

をこれは、SQLのCASE WHEN文を破るとの各部分の交換方法について説明します新しい集約パイプライン構文でSQLを実行します。ステートメント内の最初のケースの例は次のとおりです。

{ 
    $project : { 
    'viewed': { 
     '$cond': [ 
      {'$eq': ['$details', 'viewed'] }, 
      1, // if true 
      0] // else 
    } 
    } 
} 
1

以下の例はあなたに役立ちます。

サンプルデータをフォローしているとします。 assigend_toは "[email protected]" 3.Count

ここで優先度が「高いところで集計クエリ以下

db.sample.insert([ 
{ 
    "_id" : 27001, 
    "assigned_to" : "[email protected]", 
    "priority" : "High" 
} 
,{ 
    "_id" : 27002, 
    "assigned_to" : "[email protected]", 
    "priority" : "Low" 
}, 
{ 
    "_id" : 27003, 
    "assigned_to" : "[email protected]", 
    "priority" : "High" 
} 
]); 

使用は

1.Totalが

2.Countをカウント取得します「

db.sample.aggregate({$group:{ 
           _id: 0,total:{$sum:1}, 
           'assigned_to' : { $sum : { $cond: [ { $eq: [ '$assigned_to' , '[email protected]' ] }, 1, 0 ] } }, 
           'hight_priority' : { $sum : { $cond: [ { $eq: [ '$priority' , 'High' ] }, 1, 0 ] } } 
           } 
         } 
        ); 

、あなたは結果

を期待してしまいます
{ 
    "result" : [ 
     { 
      "_id" : 0, 
      "total" : 3, 
      "assigned_to" : 2, 
      "hight_priority" : 2 
     } 
    ], 
    "ok" : 1 
}