1. 程式人生 > >MongoDB的聚合操作以及與Python的互動

MongoDB的聚合操作以及與Python的互動

MongoDB聚合

什麼是聚合

MongoDB中聚合(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。

聚合是基於資料處理的聚合管道,每個文件通過由多個階段組成的管道,可以對每個階段的管道進行分組、過濾等功能,然後經過一系列處理,輸出結果。

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

管道一般用於將當前命令的輸出結果作為下一個命令的引數。

MongoDB的聚合管道將MongoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。

常用管道

下面介紹常用的管道:

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

常用聚合表示式

下面介紹常用的聚合表示式:

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

MongoDB聚合例項

現在假設集合studen中有以下資料:

{ "_id" : 1, "name" : "小然", "gender" : 1, "age" : 22, "score" : 95 }
{ "_id" : 2, "name" : "小紅", "gender" : 0, "age" : 18, "score" : 80 }
{ "_id" : 3, "name" : "小亮", "gender" : 1, "age" : 19, "score" : 60 }
{ "_id" : 4, "name" : "小強"
, "gender" : 1, "age" : 23, "score" : 70 } { "_id" : 5, "name" : "小柔", "gender" : 0, "age" : 20, "score" : 85 } { "_id" : 6, "name" : "小雷", "gender" : 1, "age" : 25, "score" : 65 } { "_id" : 7, "name" : "小冉", "gender" : 0, "age" : 19, "score" : 70 } { "_id" : 8, "name" : "小晴", "gender" : 0, "age" : 18, "score" : 90 } { "_id" : 9, "name" : "小齊", "gender" : 1, "age" : 24, "score" : 50 }
  • 以性別進行分組
    db.students.aggregate({$group:{_id:"$gender"}})

輸出結果為:

  • 統計整個文件,獲得資料個數和平均分數
    db.students.aggregate({$group:{
        _id:null,
        count:{$sum:1},
        avg_score:{$avg:"$score"}
    }})

輸出結果為:

  • 以性別進行分組,獲取不同分組中資料的個數和平均分數
    db.students.aggregate({$group:{
        _id:"$gender",
        count:{$sum:1},
        avg_score:{$avg:"$score"}
    }})

輸出結果為:

  • 使用$project修改輸出結果
    db.students.aggregate(
        {$group:{
            _id:"$gender",
            count:{$sum:1},
            avg_score:{$avg:"$score"}}
        },
        {$project:{
            gender:"$_id",
            count:1,
            _id:0,
            avg_score:"$avg_score"}
        }
    )

輸出結果為:

  • 使用$match選擇分數大於等於70的學生,統計男生、女生的人數
    db.students.aggregate(
        {$match:{score:{$gte:70}}},
        {$group:{_id:"$gender",count:{$sum:1}}},
        {$project:{gender:"$_id",count:1,_id:0}}
    )

輸出結果為:

MondoDB與Python的互動

pymongo的安裝

使用Python操作MongoDB需要安裝pymongo,安裝方法很簡單,使用pip install pymongo即可。

例項化並建立連線

首先從pymongo中匯入MongoClient,然後例項化client,建立連線,程式碼如下:

    from pymongo import MongoClient
    
    client = MongoClient(host = "127.0.0.1",port = 27017)
        #操作本機MongoDB可以寫成client = MongoClient()
    collection = client["test"]["test"]

常用操作例項

  • 插入一條資料
    collection.insert_one({"_id":0,"name":"test0"})
  • 插入多條資料
    data_list = [{"_id":i,"name":"test{}".format(i)} for i in range(10)]
    collection.insert_many(data_list)
    data_list = [{"name":"test{}".format(i)} for i in range(10)]
    collection.insert_many(data_list)

插入後結果如下圖所示,下面的操作都在此資料庫上進行操作。

  • 查詢一條記錄
    print(collection.find_one({"name":"test2"}))

輸出結果為:

  • 查詢所有記錄
    result = collection.find({"name":"test2"})
    for i in result:
        print(i)

輸出結果為:

  • 更新一條資料
    collection.update_one({"name":"test1"},{"$set":{"name":"test10"}})

執行完操作後,資料庫如下圖所示:

  • 更新全部資料
    collection.update_many({"name":"test2"},{"$set":{"name":"test20"}})

執行完操作後,資料庫如下圖所示:

  • 刪除一條資料
    collection.delete_one({"name":"test3"})

執行完操作後,資料庫如下圖所示:

  • 刪除所有滿足條件的資料
    collection.delete_many({"name":"test4"})

執行完操作後,資料庫如下圖所示:

結語

  • 本篇主要介紹了MongoDB的聚合操作以及與Python的互動,但對於我目前的學習階段來說,只用到了Python中的插入資料語句,其他的操作基本沒有用到。
  • 感謝大家的閱讀,有錯誤希望大家能夠指出,我會積極改正。