laravelでmongodbに接続して、groupbyでグループごとの集計データをとってくる

2018.09.16 Sunday 14:00
0
    laravelでmongodbに接続して、groupbyでグループごとの集計データをとってくる

    すごいわかりにくい。
    なかなかぴんとこないけど、一応データとれた
    やっぱりsqlって便利だったんだなと再認識


    ・本来のSQLでやりたいこと
    select hostname , count(*) from post_table group by hostname


    ・laravelコントローラでmongodbからgroupbyデータとってくるよう書く。
    $posts2 = Post::raw(function ($collection) {
    return $collection->aggregate([
    [
    '$match' => [
    'rtype' => '2'
    ]
    ],
    [

    '$group' => [
    '_id' => [
    'hostname' => '$hostname'
    ],
    'count' => [
    '$sum' => 1
    ]
    ]
    ]
    ]);
    });


    ・viewのblade.phpでとってこれたよ
    @foreach($posts2 as $post)
    {{ $post }}
    {{ $post['_id']['hostname'] }}
    {{ $post['count'] }}
    @endforeach


    ・MongoDBでグループごと に 集計する 方法のポイント
    ・グループ化は aggregate() の $groupで指定
    ・グループ化キーは _id で指定
    ・グループごとの件数は 'count' => ['$sum' => 1]

    -----
    category:mongodb | by:ittoocomments(0)trackbacks(0) | -

    mongodb 使えそうなコマンド一覧メモ

    2018.08.27 Monday 22:18
    0
      ■■mongodbで、substrのように左から何文字かを取得するパターン。aggregate の $project で行うよ
      db.logtable.aggregate(
      [
      {
      $project:
      {
      log_type: 1,
      log_name: 1,
      log_type2: { $substr: [ "$log_type", 0, 4 ] },
      log_name2: { $substr: [ "$log_name", 0, 4 ] }
      }
      }
      ]
      )

      ■■ongodbで、指定した行にのみsubstrのように左から何文字かを取得するパターン。aggregate の $project で行うよ
      select substr(log_type,0,4) from tblA where log_type = "rtype1"
      のようなもの

      db.logtable.aggregate([
      { $match: { "log_type": "rtype1" } },
      {
      $project:
      {
      log_type: 1,
      log_type2: { $substr: [ "$log_type", 0, 4 ] }
      }
      }
      ])


      ■■db.logtable.aggregate()
      これだけでも全件でてくる find()と同じだね


      ■■ドキュメントを3件だけ取得する場合
      limitを使う
      find()でつかうときはこれ
      > db.logtable.find().limit(3)

      aggretateてつかうときはこれ
      > db.logtable.aggregate(
      { $limit : 5 }
      );
      > db.logtable.aggregate({ $limit:3 } )


      ■■条件を指定して、なおかつ substrつかって、limit3の場合
      db.logtable.aggregate([
      { $match: { "log_type": "rtype1" } },
      {
      $project:
      {
      log_type: 1,
      log_type2: { $substr: [ "$log_type", 0, 4 ] }
      }
      },
      { $limit:3 }
      ])


      ■■日付ごとに件数をかぞえる
      db.logtable.aggregate(
      {$group:
      {_id :
      {$substr : ["$generation_date", 0,10]},
      count:{"$sum" : 1}
      }
      }
      );

      ■■日付ごとに件数をかぞえる(ただしrtype1の行のみ)
      db.logtable.aggregate(
      { $match: { "log_type": "rtype1" } },
      {$group:
      {_id :
      {$substr : ["$generation_date", 0,10]},
      count:{"$sum" : 1}
      }
      }
      );

      ◆insert
      db.messagelog.insert({"regtype":"rtype1","regname":"rname1","hostname":"hostn1","objecttype":"MONPNG","severity":"warning","generation_date":"2018-03-24T11:56:52+09:00","message":"メッセージ1"})
      category:mongodb | by:ittoocomments(0)trackbacks(0) | -

      mongodbのデータ取り出し方の操作方法。検索と登録方法

      2017.04.02 Sunday 10:55
      0
        # mongodb ログイン
        mongo

        #

        MongoDBとRDBの用語比較(厳密には異なる)

        MongDB RDB
        データベース データベース
        コレクション テーブル collections は RDBの テーブル
        ドキュメント 行(レコード)
        フィールド 列



        # mongodb insert
        collection
        db.user_collect.insert({user_id: "uid001", age: 10, status: "A"})
        db.user_collect.insert({user_id: "uid002", age: 20, status: "B"})
        db.user_collect.insert({user_id: "uid003", age: 30, status: "B"})
        db.user_collect.insert({ age: 40, status: "B"})
        db.user_collect.insert({user_id: "uid005", age: 50, status: "C"})


        # select 検索 参照
        # 全文検索 select * from tbl
        > db.user_collect.find()
        { "_id" : ObjectId("58e0441a3708943450405c54"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e044243708943450405c56"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c57"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c58"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >

        # 件数をカウント
        > db.user_collect.count()
        5

        または

        > db.user_collect.find().count()
        5
        >

        # limit指定 指定した件数のみを取得
        > db.user_collect.find().limit(3)
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a3"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a4"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        >


        # 検索フィールドを指定して検索
        第1パラメータは、検索条件
        第2パラメータで、検索フィールド
        表示したいフィールドを1にする。非表示にしたい場合は0にする。
        デフォルトで、_id が表示されるので非表示にしたい場合はこれをつかう
        db.user_collection.find({}, user_id, age )

        > db.user_collect.find({}, { age:1} )
        { "_id" : ObjectId("58e0441a3708943450405c54"), "age" : 10 }
        { "_id" : ObjectId("58e044243708943450405c55"), "age" : 20 }
        { "_id" : ObjectId("58e044243708943450405c56"), "age" : 30 }
        { "_id" : ObjectId("58e044323708943450405c57"), "age" : 40 }
        { "_id" : ObjectId("58e044323708943450405c58"), "age" : 50 }
        >

        > db.user_collect.find({}, { _id:0 , age:1} )
        { "age" : 10 }
        { "age" : 20 }
        { "age" : 30 }
        { "age" : 40 }
        { "age" : 50 }
        >

        # 検索(条件1つ)
        > db.user_collect.find({ status:"B"})
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e044243708943450405c56"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c57"), "age" : 40, "status" : "B" }
        >

        # 検索(条件複数)
        > db.user_collect.find({ status:"B",user_id:"uid002"})
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        >
        >

        # 検索(条件 or検索)

        findの第一引数に $or を指定する
        条件は[]でくくり、それぞれの条件を {} でくくる

        > db.user_collect.find({ $or: [ {status:"B"}, { status:"C"} ] })
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e044243708943450405c56"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c57"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c58"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >
        > db.user_collect.find(
        { $or: [
        { status:"B"},
        { status:"C"}
        ] }
        )



        # 比較演算子
        演算子 MongoDB 概要 サンプル
        = {name:'hoge'} nameの値がhogeの場合
        < $lt 右辺より小さい { age:{$lt:100} }
        <= $lte 右辺以下 { age:{$lte:100} }
        > $gt 右辺より大きい { age:{$gt:100} }
        >= $gte 右辺以上 { age:{$gte:100} }
        != $ne 等しくない { name:{$ne:'mr.a'} }
        該当なし $exists フィールド(列)自体の存在チェック db.mycol.find({ hoge:{$exists:false} })
        OR $or $orで指定する条件のいずれかを満たすものを抽出 db.mycol.find({$or:[{loves:'apple'},{loves:'energon'}]})



        # ageが20より大きい
        > db.user_collect.find( { age : { $gt: 20 } } )
        { "_id" : ObjectId("58e044243708943450405c56"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c57"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c58"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >
        >

        # ageが20以上
        > db.user_collect.find( { age : { $gte: 20 } } )
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e044243708943450405c56"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c57"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c58"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >
        >
        >
        # ageが20より少ない
        > db.user_collect.find( { age : { $lt: 20 } } )
        { "_id" : ObjectId("58e0441a3708943450405c54"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        >
        >

        # ageが20より以下
        > db.user_collect.find( { age : { $lte: 20 } } )
        { "_id" : ObjectId("58e0441a3708943450405c54"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        >
        >

        # like検索
        > db.user_collect.find( { user_id : /id00/} )
        { "_id" : ObjectId("58e0441a3708943450405c54"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e044243708943450405c55"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e044243708943450405c56"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e044323708943450405c58"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >
        >
        > db.user_collect.find( { user_id : /id001/} )
        { "_id" : ObjectId("58e0441a3708943450405c54"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        >
        >


        # in検索
        > db.user_collect.find( { "user_id" : { $in:["uid001","uid002"]}} )
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a3"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        >

        上のor検索もそうだけど、or検索やin検索の場合は、その後ろに[] で配列で条件を指定
        その中身はそれぞれ{}でくくると覚えておくといいかな


        # sort昇順
        > db.user_collect.find().sort({age:1})
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a3"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a4"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a5"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a6"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >
        >
        >
        # sort降順
        > db.user_collect.find().sort({age:-1})
        { "_id" : ObjectId("58e05486aa5f6141259db9a6"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a5"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a4"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a3"), "user_id" : "uid002", "age" : 20, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        >

        sortは、findの外
        sortはfindの時もそうだけど、していするばあいは({}) と外は{}で、中は{}でくくる必要がある





        # 更新
        > db.user_collect.update({user_id:"uid002"},{$set:{ age:21 }})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        >
        > db.user_collect.find()
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a3"), "user_id" : "uid002", "age" : 21, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a4"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a5"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a6"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >


        # 削除 remove()
        > db.user_collect.find()
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a3"), "user_id" : "uid002", "age" : 21, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a4"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a5"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a6"), "user_id" : "uid005", "age" : 50, "status" : "C" }

        > db.user_collect.remove( { user_id:"uid002"} )
        WriteResult({ "nRemoved" : 1 })


        > db.user_collect.find()
        { "_id" : ObjectId("58e05486aa5f6141259db9a2"), "user_id" : "uid001", "age" : 10, "status" : "A" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a4"), "user_id" : "uid003", "age" : 30, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a5"), "age" : 40, "status" : "B" }
        { "_id" : ObjectId("58e05486aa5f6141259db9a6"), "user_id" : "uid005", "age" : 50, "status" : "C" }
        >



        # 現在のデータベース状況を知る(ステータスじゃないよ、統計のstatsだよ)
        > db.stats()
        {
        "db" : "test",
        "collections" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "ok" : 1
        }
        >

        # データベース一覧
        show dbs

        # mongodbでは RDBでいう、create database、create tableは必要ない
        use データベース名
        でそのデータベース名にスイッチするが、その時点で存在してなくていい



        MongoDBのデータ構造とRDBのデータ構造の比較
        ---------------------------------------------------
        RDBでの呼称 → MongoDBでの呼称
        ・database → database
        ・table → collection
        ・row → document
        ・column → field
        ・index → index
        ・primary key _→ id field
        ※ MongoDBでは,"_id"の値に自動的に一意な文字列が採番される。
        ---------------------------------------------------
        mongodbでは操作する際に、つねにフィールド名(カラム名)の指定が必要。
        つまりカラム名もいっしょにその都度登録される。
        そのため、RDBとMongoDBの大きな違いとして
        RDBではテーブル中のすべてのレコードが同じカラムを有するのに対し,
        MongoDBではドキュメントごとに自由なフィールドを定義できる



        データベース操作
        MySQL MongoDB
        > SHOW DATABASES; > show dbs
        > USE testdb; > use testdb
        > CREATE DATABASE testdb; useコマンドで自動生成
        > DROP DATABASE testdb; > use testdb
        > db.dropDatabase()
        > DESC testdb; なし



        > show collections
        system.indexes
        user_collect

        > show dbs
        aaaaa 0.078GB
        local 0.078GB
        testdb 0.078GB
        >
        category:mongodb | by:ittoocomments(0)trackbacks(0) | -

        mongodbインストール方法メモ

        2017.04.02 Sunday 10:52
        0
          /etc/yum.repos.d/mongodb-org-3.0.repoを作成

          [mongodb-org-3.0]
          name=MongoDB Repository
          baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
          gpgcheck=0
          enabled=1

          # mongodb インストール
          yum install mongodb-org

          # mongodb 起動
          systemctl start mongod

          # mongodb 停止
          systemctl stop mongod

          # mongodb 自動起動
          chkconfig mongod on

          # mongodb ログイン
          mongo

          # 現在のデータベース状況を知る(ステータスじゃないよ、統計のstatsだよ)
          > db.stats()
          {
          "db" : "test",
          "collections" : 0,
          "objects" : 0,
          "avgObjSize" : 0,
          "dataSize" : 0,
          "storageSize" : 0,
          "numExtents" : 0,
          "indexes" : 0,
          "indexSize" : 0,
          "fileSize" : 0,
          "ok" : 1
          }
          >

          # データベース一覧
          show dbs

          # mongodbでは RDBでいう、create database、create tableは必要ない
          use データベース名
          でそのデータベース名にスイッチするが、その時点で存在してなくていい

          #


          MongoDBとRDBの用語比較(厳密には異なる)

          MongDB RDB
          データベース データベース
          コレクション テーブル collections は RDBの テーブル
          ドキュメント 行(レコード)
          フィールド 列
          category:mongodb | by:ittoocomments(0)trackbacks(0) | -

          ad
          Calender
           123456
          78910111213
          14151617181920
          21222324252627
          282930    
          << June 2020 >>
          Selected entry
          PR
          Category
          Archives
          Recent comment
          • パス指定 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated ¥xXX escape
            久米隆文
          • 円マークが自動変換されてる
            aaaaaa
          • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
            66hills
          • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
            ssd
          • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
            max
          • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
            DOM
          • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
            DOM
          • コンピュータ業界の根本的な変化
            cloud
          • コンピュータ業界の根本的な変化
            Dellの仮想化
          • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
            えちごや
          Recent trackback
          • スマートフォンの法人活用例
            無線LANネットのブログ
          • Yahoo!オークションからのアフィリエイト収入が一気に70%減になってしまい涙目になってる話
            特選情報
          Recommend
          Link
          Profile
          Search
          Others
          Mobile
          qrcode
          Powered
          無料ブログ作成サービス JUGEM