1. 程式人生 > 實用技巧 >Mongodb高階操作

Mongodb高階操作

練習資料

 db.students.insert(
     [
         {'_id':0, 'name': '小林', 'gender': '男', 'age': 20},
         {'_id':1, 'name': '小黑', 'gender': '男', 'age': 20},
         {'_id':2, 'name': '小白', 'gender': '男', 'age': 22},
         {'_id':3, 'name': '小小林', 'gender': '女', 'age': 21},
         {'_id':4, 'name': '小徐', 'gender': '女', 'age': 19},
         {
'_id':5, 'name': '小吳', 'gender': '女', 'age': 20}, {'_id':6, 'name': '小紅', 'gender': '女', 'age': 30}, {'_id':7, 'name': '小明', 'gender': '男', 'age': 20}, {'_id':8, 'name': '小林', 'gender': '男', 'age': 19}, {'_id':9, 'name': '小林', 'gender': '男', 'age': 20}, {'_id':10, 'name': '張小紅', 'gender': '女', 'age': 19}, ] )

插入資料

聚合 aggregate

聚合(aggregate)主要用於計算資料,類似sql中的sum()、avg()

語法

db.集合名稱.aggregate([{管道:{表示式}}])

管道

管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的輸入

在mongodb中,管道具有同樣的作用,文件處理完畢後,通過管道進行下一次處理

常用管道

  • $group:將集合中的文件分組,可用於統計結果
  • $match:過濾資料,只輸出符合條件的文件
  • $project:修改輸入文件的結構,如重新命名、增加、刪除欄位、建立計算結果
  • $sort:將輸入文件排序後輸出
  • $limit:限制聚合管道返回的文件數
  • $skip:跳過指定數量的文件,並返回餘下的文件
  • $unwind:將陣列型別的欄位進行拆分

表示式

處理輸入文件並輸出

常用表示式

  • $sum:計算總和,$sum:1同count表示計數
  • $avg:計算平均值
  • $min:獲取最小值
  • $max:獲取最大值
  • $push:在結果文件中插入值到一個數組中
  • $first:根據資源文件的排序獲取第一個文件資料
  • $last:根據資源文件的排序獲取最後一個文件資料

$group

將集合中的文件分組,可用於統計結果

_id表示分組的依據,使用某欄位的格式為 $欄位

舉例:統計男生和女生的總人數

db.students.aggregate(
    [
        {$group:
            {
                _id: "$gender",
                counter: {$sum: 1}
            }
        }
    ]
)

將集合中所有文件分為一組,求學生總人數和平均年齡

db.students.aggregate(
    [
        {$group:
            {
                _id: null,
                counter: {$sum: 1},
                avgAge: {$avg: '$age'}
            }
        }
    ]
)

統計學生性別和姓名

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                name: {$push: '$name'}
            }
        }
    ]
)

使用$$ROOT可以將文件加入到結果集的陣列中

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                name: {$push: '$$ROOT'}
            }
        }
    ]
).pretty()

$match

用於過濾資料,只輸出符合條件的文件

舉例:查詢年齡大於20的學生

db.students.aggregate(
    [
        {$match:
            {age:{$gt: 20}}
        }
    ]
)

查詢年齡大於20的男生女生人數

db.students.aggregate(
    [
        {$match:
            {age:{$gt: 20}},
        },
        {$group:
            {
                _id: '$gender',
                counter: {$sum: 1}
            }
        }
    ]
)

$project

修改輸入文件的結構

舉例:查詢學生的姓名和年齡

db.students.aggregate(
    [
        {$project:
            {
                _id: 0,
                name: 1,
                age: 1
            }
        }
    ]
)

查詢男生女生人數,並輸出人數

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                counter: {$sum: 1}
            }
        },
        {$project:
            {
                _id: 1,
                counter: 1
            }
        }
    ]
)

$sort

將輸入文件排序後輸出

舉例:查詢學生資訊,按年齡升序

db.students.aggregate(
    [
        {$sort:
            {age: 1}
        }
    ]
)

查詢男生女生人數,按人數降序

db.students.aggregate(
    [
        {$group:
            {
                _id: '$gender',
                counter: {$sum: 1}
            }
        },
        {$sort:
            {
                counter: -1
            }
        }
    ]
)

$limit

限制聚合管道返回的文件數

舉例:查詢兩條學生資訊

db.students.aggregate(
    [
        {$limit: 2}
    ]
)

$skip

跳過指定數量的文件,並返回餘下文件

舉例:查詢從第三條開始的學生資訊

db.students.aggregate(
    [
        {$skip: 2}
    ]
)