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

来源:https://www.cnblogs.com/dblsha/archive/2018/11/29/10039894.html
-Advertisement-
Play Games

上一篇主要介紹了MongoDB的基本操作,包括創建、插入、保存、更新和查詢等,鏈接為 "MongoDB基本操作" 。 在本文中主要介紹MongoDB的聚合以及與Python的交互。 MongoDB聚合 什麼是聚合 MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等), ...


上一篇主要介紹了MongoDB的基本操作,包括創建、插入、保存、更新和查詢等,鏈接為MongoDB基本操作
在本文中主要介紹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中的插入數據語句,其他的操作基本沒有用到。
  • 感謝大家的閱讀,有錯誤希望大家能夠指出,我會積極改正。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • linux 安裝 powershell Intro powershell 已經推出了一個 Powershell Core, 版本號對應 Powershell 6.x,可以跨平臺,支持 Linux 和 mac. 這使得對於熟練使用 Powershell 進行開發運維的一些開發者來說無疑是個福音。 今天 ...
  • 一. 用戶、用戶組概念及其文件結構詳解 Linux用戶只有兩個等級:root及非root。Linux中還有一部分用戶,如:apache、mysql、nobody、ftp等,這些也都是非root用戶,即普通用戶。Linux的許可權實際是上不同用戶所能訪問的文件的不同產生的假象。而這些假象的造成,還要涉及 ...
  • 查看git版本,卸載舊版本(如果沒有安裝git請直接到下一步) 安裝依賴軟體 編譯安裝最新的git版本 添加到環境變數 好了最新的git就裝好了。 歡迎關註公眾號 ...
  • DMZ是網路的一個區域,介於外網與內網之間的一個特殊區域,既然說他特殊,就有他的特殊性,也成隔離區。在傳統意義上,安裝了防火牆後,外部網路是不能訪問內部網路的,要不還要防火牆幹啥,假如說外部網路想要訪問內部網路,比如內部網路有台WEB主機,對外提供服務,就得解決安裝防火牆之後的矛盾了, DMZ防火牆 ...
  • MongoDB有主從複製和副本集兩種主從複製模式,主從複製最大的問題就是無法自動故障轉移,MongoDB副本集解決了主從模式無法自動故障轉義的特點,因此是複製的首選。對於簡單的主從複製無法自動故障轉移的缺陷,各個資料庫都在改進,MySQL推出的MGR,Redis的哨兵,Mongodb的複製集。 對於 ...
  • dbpath下是清一色的collection-n-***與index-n-***開頭的物理文件,如何知道某一個集合與其對應與其對應的物理文件? db.collection_name.stats() 返回的結果包含集合數據對應的物理文件 db.collection_name.stats({indexD ...
  • 2017年下半年新發佈的MongoDB 3.6版本在安全性上做了很大提升,主要歸結為兩點: 1.將將bind_ip 預設值修改為了localhost; 2. 在db.createUser()和 db.updateUser()中添加了authenticationRestrictions 參數,可以用來 ...
  • 檢查主備機的sys 密碼是否一致,忘記密碼可以修改,同步 。alter user sys identified by xxx; orapwd file=oraxxx.ora password=admin entries=40force=y; 檢查靜態tnsnames.ora 和listener.or... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...