暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

左羊备忘录-MongoDB常用聚合查询

左羊公社 2021-03-16
147
人生没有什么事情是给别人做的。工作不是为了老板,是为了自己长本事赚钱。变美不是为了另一半,是为了自己得瑟摇摆。所有的努力都是你自己的选择,所有的荣耀和耻辱、成长和眼泪都由自己来担。(by 琦殿)


本次左羊还是以Mysql与mongoDB对比的形式,展示mongodb的聚合查询。好了闲言少续,开始吧。

 

 

数据字典

库名 ming_dunasty 明朝

表名 hero 英雄

名称

类型

备注

id_number

int

排序标识

name

String

姓名

gender

String

性别

position

String

职位

note

String

备注

MongoDB中聚合的方法使用aggregate()。

语法

aggregate() 方法的基本语法格式如下所示:

    >db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

     

    排序

    倒序

    Mysql

      SELECT * from hero ORDER BY id_number desc

      id_number

      name

      gender

      position

      note

      7

      常遇春

      侦察旅旅长

      给朱元璋打工的

      6

      胡惟庸

      宰相

      给朱元璋打工的

      5

      徐达

      元帅

      给朱元璋打工的

      4

      刘伯温

      谋士

      给朱元璋打工的

      3

      陈友谅

      霸主

      被朱元璋打败

      2

      张士诚

      霸主

      被朱元璋打败

      1

      朱元璋

      皇帝

      洪武大帝

      Mongo

        > db.hero.aggregate({$sort:{"id_number":-1}})
        { "_id" : ObjectId("60477e15d9fd4d508eb534d5"), "name" : "常遇春", "gender" : "男", "position" : "侦察旅旅长", "note" : "给朱元璋打工的", "id_number" : 7 }
        { "_id" : ObjectId("60477e15d9fd4d508eb534d4"), "name" : "胡惟庸", "gender" : "男", "position" : "宰相", "note" : "给朱 元璋打工的", "id_number" : 6 }
        { "_id" : ObjectId("60477e15d9fd4d508eb534d3"), "name" : "徐 达", "gender" : "男", "position" : "元帅", "note" : "给朱元璋打工的", "id_number" : 5 }
        { "_id" : ObjectId("60477e15d9fd4d508eb534d2"), "name" : "刘伯温", "gender" : "男", "position" : "谋士", "note" : "给朱 元璋打工的", "id_number" : 4 }
        { "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 3 }
        { "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 2 }
        { "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "gender" : "男", "position" : "皇帝", "note" : "洪武 大帝", "id_number" : 1 }

        正序

        Mysql

          SELECT * from hero ORDER BY id_number asc

          id_number

          name

          gender

          position

          note

          1

          朱元璋

          皇帝

          洪武大帝

          2

          张士诚

          霸主

          被朱元璋打败

          3

          陈友谅

          霸主

          被朱元璋打败

          4

          刘伯温

          谋士

          给朱元璋打工的

          5

          徐达

          元帅

          给朱元璋打工的

          6

          胡惟庸

          宰相

          给朱元璋打工的

          7

          常遇春

          侦察旅旅长

          给朱元璋打工的

          Mongo

            > db.hero.aggregate({$sort:{"id_number":1}})
            { "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "gender" : "男", "position" : "皇帝", "note" : "洪武 大帝", "id_number" : 1 }
            { "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 2 }
            { "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 3 }
            { "_id" : ObjectId("60477e15d9fd4d508eb534d2"), "name" : "刘伯温", "gender" : "男", "position" : "谋士", "note" : "给朱 元璋打工的", "id_number" : 4 }
            { "_id" : ObjectId("60477e15d9fd4d508eb534d3"), "name" : "徐 达", "gender" : "男", "position" : "元帅", "note" : "给朱元璋打工的", "id_number" : 5 }
            { "_id" : ObjectId("60477e15d9fd4d508eb534d4"), "name" : "胡惟庸", "gender" : "男", "position" : "宰相", "note" : "给朱 元璋打工的", "id_number" : 6 }
            { "_id" : ObjectId("60477e15d9fd4d508eb534d5"), "name" : "常遇春", "gender" : "男", "position" : "侦察旅旅长", "note" : "给朱元璋打工的", "id_number" : 7 }

            重命名

            Mysql

              SELECT name,position as "职业" from hero

              name

              职业

              朱元璋

              皇帝

              张士诚

              霸主

              陈友谅

              霸主

              刘伯温

              谋士

              徐达

              元帅

              胡惟庸

              宰相

              常遇春

              侦察旅旅长

              Mongo

                > db.hero.aggregate({$project:{"职业":"$position","name":1}})
                { "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "职业" : "皇帝" }
                { "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "职业" : "霸主" }
                { "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "职业" : "霸主" }
                { "_id" : ObjectId("60477e15d9fd4d508eb534d2"), "name" : "刘伯温", "职业" : "谋士" }
                { "_id" : ObjectId("60477e15d9fd4d508eb534d3"), "name" : "徐 达", "职业" : "元帅" }
                { "_id" : ObjectId("60477e15d9fd4d508eb534d4"), "name" : "胡惟庸", "职业" : "宰相" }
                { "_id" : ObjectId("60477e15d9fd4d508eb534d5"), "name" : "常遇春", "职业" : "侦察旅旅长" }

                分组

                Mysql

                  SELECT position,count(*) from hero GROUP BY position

                  position

                  count(*)

                  侦察旅旅长

                  1

                  元帅

                  1

                  宰相

                  1

                  皇帝

                  1

                  谋士

                  1

                  霸主

                  2

                  Mongo

                    > db.hero.aggregate([{$group:{_id:"$position",count:{$sum:1}}}])
                    { "_id" : "元帅", "count" : 1 }
                    { "_id" : "皇帝", "count" : 1 }
                    { "_id" : "霸主", "count" : 2 }
                    { "_id" : "宰相", "count" : 1 }
                    { "_id" : "侦察旅旅长", "count" : 1 }
                    { "_id" : "谋士", "count" : 1 }

                    分页

                    Mysql

                      SELECT * from hero LIMIT 1

                      id_number

                      name

                      gender

                      position

                      note

                      1

                      朱元璋

                      皇帝

                      洪武大帝

                      Mongo

                        > db.hero.aggregate({$limit:1})
                        { "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "gender" : "男", "position" : "皇帝", "note" : "洪武 大帝", "id_number" : 1 }

                         

                        条件过滤

                        Mysql

                          SELECT * from hero where position = "霸主"

                          id_number

                          name

                          gender

                          position

                          note

                          2

                          张士诚

                          霸主

                          被朱元璋打败

                          3

                          陈友谅

                          霸主

                          被朱元璋打败

                          Mongo

                            > db.hero.aggregate({$match:{"position":"霸主"}})
                            { "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 2 }
                            { "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 3 }

                            复杂实战

                            Mysql

                              SELECT position,COUNT(position) from hero where gender = "男" group by position ORDER BY position desc limit 4

                              position

                              COUNT(position)

                              霸主

                              2

                              谋士

                              1

                              皇帝

                              1

                              宰相

                              1

                              Mongo

                                > db.hero.aggregate([{$match:{"gender":"男"}},{$group:{_id:"$position",count:{$sum:1}}},{$project:{"position":"$_id","COUNT(position)":"$count",_id:0,"id_number":"$id_number"}},{$sort:{"position":-1}},{$limit:4}])
                                { "position" : "霸主", "COUNT(position)" : 2 }
                                { "position" : "谋士", "COUNT(position)" : 1 }
                                { "position" : "皇帝", "COUNT(position)" : 1 }
                                { "position" : "宰相", "COUNT(position)" : 1 }

                                 

                                待解决问题

                                Mysql

                                  SELECT id_number,position,COUNT(position) from hero where gender = "男" group by position ORDER BY position desc limit 4

                                  上面这种sql查询左羊还没搞明白用Mongo如何查询?


                                  [

                                  END

                                  ]


                                  关注左羊公社






                                  文章转载自左羊公社,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                  评论