laravel mongodbでグルーピングしたキーでソート

2018.09.16 Sunday 22:51
0
    mongodbでグルーピングしたキーでソート(larabel使用時)
    以下、hostnameでグルーピングしている場合、その名前でソート。逆の場合(desc)は、-1にする
    $posts2 = Post::raw(function ($collection) {
        return $collection->aggregate([
            [
                '$match' => [
                    'rtype'   => 'rtype_2'
                ]
            ],
            [
    
                '$group' => [
                    '_id'   => [
                        'hostname' => '$hostname'
                    ],
                    'count' => [
                        '$sum' => 1
                    ]
                ]
            ],
            [ 
                '$sort' => [
                    '_id' => 1 
                ]
            ]
        ]);
    });
    
    category:mongodb | by:ittoocomments(0)trackbacks(0) | -

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

    2018.09.16 Sunday 14:04
    0
      (参考まで)
      ModelName::selectRaw('COUNT(*) AS "count", boolean_one, date_trunc(¥'day¥', created_at) as date')
          ->where('created_at', '>=', Carbon::now()->subMonth())
          ->where('boolean_two', '=', $booleanTwo)
          ->where('string_value', 'LIKE', $searchForString . '%')
          ->groupBy('boolean_one')->groupBy('date')
          ->orderBy('date')->get();
      

      ModelName::raw(function ($collection) {
          return $collection->aggregate([
              [
                  '$match' => [
                      'created_at' => ['$gt' => new MongoDate(Carbon::now()->subMonths(1)->timestamp)],
                      'boolean_two'     => $booleanTwo,
                      'string_value'   => ['$regex' => new MongoRegex('/.*'.$searchForString.'.*/')]
                  ],
              ],
              [
      
                  '$group' => [
                      '_id'   => [
                          'month'  => ['$month' => '$created_at'],
                          'day'    => ['$dayOfMonth' => '$created_at'],
                          'year'   => ['$year' => '$created_at'],
                          'boolean_one' => '$boolean_one'
                      ],
                      'count' => [
                          '$sum' => 1
                      ]
                  ]
              ]
          ]);
      });
      
      category:mongodb | by:ittoocomments(0)trackbacks(0) | -

      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) | -

            ad
            Calender
                  1
            2345678
            9101112131415
            16171819202122
            23242526272829
            30      
            << September 2018 >>
            Selected entry
            PR
            Category
            Archives
            Recent comment
            • 円マークが自動変換されてる
              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サービスがつながらない
              えちごや
            • マクドナルドでYahoo BBモバイルポイント 公衆無線LANサービスがつながらない
              touch
            Recent trackback
            • スマートフォンの法人活用例
              無線LANネットのブログ
            • Yahoo!オークションからのアフィリエイト収入が一気に70%減になってしまい涙目になってる話
              特選情報
            Recommend
            Link
            Profile
            Search
            Others
            Mobile
            qrcode
            Powered
            無料ブログ作成サービス JUGEM