[Mongodb]集計クエリ&&固定コレクション

概観

データストレージは、クエリと統計用です。データを保存するだけでよい場合、クエリを実行する必要はありません。この種のデータはほとんど価値がありません。

この記事ではMongodbを紹介します

  • 集計クエリ(Aggregation)
  • キャップされたコレクション

 

準備

10000データを準備する

var orders = new Array();
forvar i = 10000; i <20000; i ++ ){ 
    orders [i] = { 
        orderNo:i + Math.random()。toString()。substr(3、3 )、
        価格:Math.round(Math.random () * 10000)/ 100 
        数量:Math.floor(Math.random() * 10)+ 1 
        orderTime:new Date(new Date()。setSeconds(Math.floor(Math.random()* 10000 )) )
    }; 
} 
db.order.insert(orders);

 

 

集計クエリ

Mongodbの集約関数の操作はすべてdb.collection.aggregateにあります。グループ化、統計、その他の関数を実現するための集約パイプライン(一連のルール)を定義することにより、以下は一般的に使用されるいくつかの集約関数を紹介します

 

グループパイプライン($グループ)

フォーマット

{ 
  $ group:
    {_ 
      id: <expression>、// 式でグループ化 
      <field1>:{<accumulator1>:<expression1> }、
      ... 
    } 
 }

_idはグループ化フィールドです。_id= nullまたは定数フィールドを指定すると、結果セット全体がグループ化されます。

グループ化統計フィールドの形式{<アキュムレータ1>:<式1>}

アキュムレータ演算子(アキュムレータ演算子)リファレンスアキュムレータ演算子

 

ここで、注文価格の合計、平均価格、最大、最小、および1時間あたり1日あたりの注文の総数を数える必要があるとします。

db.order.aggregate([ 
    { 
        $ group:{ 
            // グループフィールド、ここでは$ dateToString形式を使用、ここでは時間別の統計 
            _id:{$ dateToString:{format: "%Y-%m-%d%H" 、date: "$ orderTime" }}、
             // 合計価格 
            totalPrice:{$ sum: "$ price" }、
             // 最初の注文を最初にグループ化 
            OrderOrder:{$ first: "$ orderNo" }、
             // 最後の注文をグループ化Order 
            lastOrder:{$ last: "$ orderNo" }、
             // 平均価格 
            averagePrice:{$ avg: "$ price" }、
             // 最大価格 
            maxPrice:{$ max: "$価格"}、
            // 最低価格 
            minPrice:{$ min: "$ price" }、
             // 合計注文数 
            totalOrders:{$ sum:1 }、
        } 
    } 
])

結果を返す

{"_id": "2020-04-12 15"、 "totalPrice":172813.68、 "firstOrder": "10000263"、 "lastOrder": "19999275"、 "averagePrice":49.20662870159453、 "maxPrice":99.94、 "minPrice ":0.01、" totalOrders ":3512 } 
{ " _id ":" 2020-04-12 13 "、" totalPrice ":80943.98、" firstOrder ":" 10004484 "、" lastOrder ":" 19991554 "、" averagePrice ": 50.780414052697616、 "maxPrice":99.81、 "minPrice":0.08、 "totalOrders":1594 } 
{ "_id": "2020-04-12 14"、 "totalPrice":181710.15、 "firstOrder": "10001745"、 "lastOrder ":"19998830"、 "averagePrice":49.76996713229252、 "maxPrice":99.93、 "minPrice":0.01、 "totalOrders":3651 } 
{"_id": "2020-04-12 16"、 "totalPrice":63356.12、 "firstOrder": "10002711"、 "lastOrder": "19995793"、 "averagePrice":50.97032984714401、 "maxPrice":99.95、 "minPrice" :0.01、「totalOrders」:1243}

 

スクリーニングパイプライン($一致)

フォーマット

{$ match:{<query>}}

これは比較的簡単です、それはデータをフィルタリングすることです

(10、15)の間の量をフィルター処理する必要があるとします。

db.orders.aggregate([ 
    { 
        $ match:{
             "price":{$ gt:10、$ lt:15 } 
        } 
    } 
])

 

パイプラインの並べ替え($並べ替え)

フォーマット

{$ sort:{<field1>:<sort order>、<field2>:<sort order> ...}}

フィールドの並べ替えを指定、1:昇順、-1:逆順

 

制限数($制限)

フォーマット

{$ limit:<正の整数>}

 

Mongodbには多くの集約パイプラインがあり、1つずつリストされていません。集約パイプラインステージ -MongoDB マニュアルを参照してください

 

 

(集約)を集約パイプラインに使用できます

とは言っても、Mongodb集約関数の最も強力な関数は、組み合わせパイプラインの使用ではありません。クエリを実行するにはデータが必要です。Mongodbは多くの集約パイプライン関数を提供しているため、組み合わせて使用​​すると非常に強力です。

パイプラインの順序に注意する必要があります。Mongodbは各ステップの結果セットを次のパイプラインに渡し、定義した順序で処理します。出力は最後のパイプラインの結果セットであるため、パイプラインの順序が異なると予期しない結果になる場合があります。その結果、エラーも報告されます(この場合、エラーは予期しない結果よりも優れています)
次の条件を満たす注文が1日あたりの時間数でカウントされると仮定します。
  • 注文金額が10元を超えて50元未満&&数量が5以下で、
  • 最小金額の50注文を削除&&最大金額の50注文を削除
  • 各時間の注文数量と注文金額を数えます
  • 昇順で出力
db.order.aggregate([ 
    { 
        $ match:{ "price":{$ gt:10、$ lt:50}、 "qty":{$ lte:5 }} 
    }、
    { 
        $ sort:{
             "price": -1 
        } 
    }、
    { 
        $ skip: 50 
    }、
    { 
        $ sort:{
             "price":1 
        } 
    }、
    { 
        $ skip: 50 
    }、
    { 
        $ group:{ 
            _id:{$ dateToString:{format: "%Y- %m-%d%H "、日付:" $ orderTime " }}、
            totalPrice:{$ sum: " $ price " }、
            totalOrders:{$ sum: 1 } 

        } 
    }、
    { 
        $ sort:{
             "totalPrice":1 
        } 
    } 
])
コードを表示

ソリューション

  1. 基準($一致)を満たすレコードをフィルタリングします
  2. 金額による逆順($ソート:-1)
  3. 最大量の50レコードをスキップします($スキップ:50)
  4. 金額の昇順($ソート:1)
  5. 最小量の50レコードをスキップします($スキップ:50)
  6. 1日あたりの時間ごとの統計($グループ)
  7. 昇順の統計結果の合計量($ソート:1)

 

固定セット

概観

capped-collectionは、挿入順序に基づいてドキュメントを挿入および取得する高スループット操作をサポートする固定サイズのコレクションです。キャップされたコレクションは、循環バッファーと同様に機能します。コレクションが割り当てられたスペースをいっぱいにすると、コレクション内の最も古いドキュメントを上書きすることにより、新しいドキュメントのためのスペースができます。

上記の定義から、固定セットにはいくつかの特性があることがわかります。

  • 固定サイズ
  • 高スループット
  • 挿入順にドキュメントを取得する
  • 制限サイズを超えた古いドキュメントの上書き

固定セットの特性によると、固定セットは次のシナリオに適しています

  • 最新のログクエリシステムを維持する
  • キャッシュデータ(ホットスポットデータ)
  • 待って

収集制限を修正

  • 固定コレクションサイズは作成後に変更できません
  • 固定コレクションのドキュメントを削除することはできません。コレクションを削除して固定コレクションを再構築することしかできません
  • 固定コレクションは固定パーティションを使用できません
  • 集計パイプライン$ outは固定コレクションでは使用できません

固定セット使用

 1.固定コレクションを作成します

db.createCollection( "log"、{上限:true、サイズ:4096、最大:5000})
野原 しなければならない 解説
キャップ はい       固定コレクションを作成するかどうか
サイズ はい 固定コレクションサイズ、単位:バイト
最高 いいえ ドキュメントサイズの制限

サイズと最大値はOR関係であり、制限の1つを超えると、古いドキュメントが上書きされます

 

2.コレクションが修正されているかどうかを確認します

db.collection.isCapped()

 

3.非固定セットを固定セットに変換します

db.runCommand({"convertToCapped": "mycoll"、サイズ:100000});

 

 

固定コレクションをテストする

1.文書数の制限を超えました

// 1.固定コレクションを作成し、サイズ1M、ドキュメントの最大数10 
db.createCollection( "log"、{capped:true、size:1024 * 1024、max:10 }); 

// 2. 200のデータ
挿入しますvar i = 0; i <200; i ++ ){ 
    db.log.insertOne({
         " _ id ":i + 1  "userId":Math.floor(Math.random()* 1000 )、
         "content": "ログイン"+(" 0000 "+ i).slice(-4 )、
         " createTime ":new Date()、
    }); 
}

 

次に、現在のMongodbストレージをクエリします

db.log.stats()

 

フィールドが固定長であるため、各オブジェクトが78バイトを占めることがわかります。

 

2.オペレーションストレージサイズを確認する

サイズフィールドが4096以下の場合、コレクションのキャップは4096バイトになります。それ以外の場合、MongoDBは指定されたサイズを増やして、256の整数倍にします。

サイズフィールドが4096未満に設定されている場合、Mongodbは256の倍数のデータストレージサイズを提供します

256のサイズを想定すると、256/78 = 3.282051282051282、3つのドキュメントを格納できるはずです

// 1. 
db.log.dropを

削除する前に固定コレクションを削除します(); // 2.サイズ<78の固定コレクションを作成し、256サイズが作成されることを確認し 
ますdb.createCollection( "log"、{capped:true、size: 78 }); 

// 2. 200インサートデータ
のためのVAR I 0 =; I <200であり、I ++ ){ 
    db.log.insertOne({
         "_id":+ I. 1  "はuserId":Math.floor(数学.random()* 1000 )、
         "content": "Login" +( "0000" + i).slice(-4 )、
         "createTime":new Date()、
    }); 
}

コレクション統計を表示する

db.log.stats()

ログコレクションは234バイト(78 * 3)を使用することがわかります。これは3つのドキュメントのサイズであり、使用可能な最大サイズは256です。

 

3.固定コレクションのクエリ

Mongodbが並べ替えフィールドを指定しない場合、入金順に取得されます。.sort({$ natural:-1})を使用して出力順序を変更できます

db.log.find({})。sort({$ natural:-1})

 

 4.非固定セットを固定セットに変換します

注文を変換してみてください

db.runCommand({"convertToCapped": "order"、size:8096});

注文収集統計の表示

 

 

 残り90データ

 

おすすめ

転載: www.cnblogs.com/WilsonPan/p/12692642.html