03-數(shù)據(jù)庫MongoDB[Python]

一、MongoDB簡介

  • 概述
    MongoDB是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫阿弃。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。

    MongoDB介于關(guān)系型數(shù)據(jù)和非關(guān)系型數(shù)據(jù)庫之間缀雳,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富渡嚣,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散肥印,類似json格式识椰,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。

    MongoDB最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大深碱,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言腹鹉,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫表單查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引敷硅。

  • MySQL
    關(guān)系型數(shù)據(jù)庫功咒。 查詢語句是使用傳統(tǒng)的sql語句愉阎,擁有較為成熟的體系,成熟度很高力奋。 關(guān)系型數(shù)據(jù)庫遵循ACID規(guī)則 開源數(shù)據(jù)庫的份額在不斷增加榜旦,mysql的份額頁在持續(xù)增長。 缺點(diǎn):在海量數(shù)據(jù)處理的時(shí)候效率會(huì)顯著變慢景殷。

    數(shù)據(jù)庫事務(wù)必須具備ACID特性溅呢,ACID是Atomic原子性,Consistency一致性猿挚,Isolation隔離性咐旧,Durability持久性。
    數(shù)據(jù)的持久存儲绩蜻,尤其是海量數(shù)據(jù)的持久存儲铣墨,還是需要一種關(guān)系數(shù)據(jù)庫。

  • MongoDB
    非關(guān)系型數(shù)據(jù)庫(nosql ),屬于文檔型數(shù)據(jù)庫辜羊。存儲方式:虛擬內(nèi)存+持久化踏兜。
    查詢語句:是獨(dú)特的MongoDB的查詢方式。
    適合場景:事件的記錄八秃,內(nèi)容管理或者博客平臺等等碱妆。
    數(shù)據(jù)處理:數(shù)據(jù)是存儲在硬盤上的,只不過需要經(jīng)常讀取的數(shù)據(jù)會(huì)被加載到內(nèi)存中昔驱,將數(shù)據(jù)存儲在物理內(nèi)存中疹尾,從而達(dá)到高速讀寫。
    成熟度與廣泛度:新興數(shù)據(jù)庫骤肛,成熟度較低纳本,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫,比較完善的DB之一腋颠,適用人群不斷在增長繁成。
    優(yōu)勢: 快速!在適量級的內(nèi)存的MongoDB的性能是非常迅速的淑玫,它將熱數(shù)據(jù)存儲在物理內(nèi)存中巾腕,使得熱數(shù)據(jù)的讀寫變得十分快, 高擴(kuò)展絮蒿, json的存儲格式尊搬!

    文檔的數(shù)據(jù)庫: 即可以存放xml、json土涝、bson類型系那個(gè)的數(shù)據(jù)佛寿。這些數(shù)據(jù)具備自述性(self-describing),呈現(xiàn)分層的樹狀數(shù)據(jù)結(jié)構(gòu)但壮。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成冀泻。

  • 關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的區(qū)別
    關(guān)系型數(shù)據(jù)庫通過外鍵關(guān)聯(lián)來建立表與表之間的關(guān)系常侣;
    非關(guān)系型數(shù)據(jù)庫通常指數(shù)據(jù)以對象的形式存儲在數(shù)據(jù)庫中,而對象之間的關(guān)系通過每個(gè)對象自身的屬性來決定腔长;

    學(xué)生: 張三
    性別: 男
    科目: 語文
    成績: 80
    
    關(guān)系型數(shù)據(jù)庫:
      // 學(xué)生表
      create table student(id int primary key, name char(50), sex char(10))
      // 成績表袭祟,stuid存儲的是學(xué)生表中對應(yīng)的主鍵,用于表的關(guān)聯(lián)
      create table score(id int primary key, name char(20),grade int,stuid int, foreign key(stuid) references student(id))
    
    非關(guān)系型數(shù)據(jù)庫:
    {
      "name":"張三",
      "sex":"男",
      "score":{
        "name":"語文",
        "grade": 80
      }
    }
    
    

    關(guān)系型數(shù)據(jù)庫SQLite捞附、Oracle巾乳、mysql
    非關(guān)系型數(shù)據(jù)庫 MongoDb、redis

  • MySQL和MongoDB的區(qū)別
    數(shù)據(jù)庫: 容器鸟召,不管是mysql還是mongodb胆绊,一個(gè)單一的服務(wù)器都可以管理多個(gè)數(shù)據(jù)庫;
    集合:是一組mongodb的文件,等價(jià)于mysql中的table欧募,集合中文檔可以有不同的字段压状,也可以有不同的數(shù)據(jù)類型;

二、MongoDB安裝和卸載

  • 卸載

    sudo apt-get autoremove mongodb
    sudo apt-get autoclean mongodb
    
    // 清除殘留數(shù)據(jù)
    dpkg -l |grep ^rc|awk '{print $2}' |tr ["\n"] [" "]|sudo xargs dpkg -P   
    
    
  • 安裝

    第1步 – 導(dǎo)入公鑰**
      Ubuntu軟件包管理器apt(高級軟件包工具)需要軟件分銷商的GPG密鑰來確保軟件包的一致性和真實(shí)性跟继。 執(zhí)行此下面的命令將MongoDB密鑰導(dǎo)入到您的服務(wù)器:
      sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
    
    第2步 – 創(chuàng)建源列表文件MongoDB
      檢查URL http://repo.mongodb.org/apt/ubuntu/dists/种冬。
      如果您在該網(wǎng)頁上看到一個(gè)目錄“bionic”,則將下述命令中的單詞“xenial”替換為“bionic”一詞舔糖,
    【原因:MongoDB尚未發(fā)布Bionic Beaver軟件包娱两,但Xenial軟件包在Ubuntu 18.04 LTS上運(yùn)行良好】
      執(zhí)行以下命令在/etc/apt/sources.list.d/中創(chuàng)建一個(gè)MongoDB列表文件:
      echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
    
    第3步 – 更新存儲庫
      使用apt命令更新存儲庫:
      sudo apt-get update
      說明:執(zhí)行完會(huì)提示一些失敗,不用在意
    
    第4步 – 安裝MongoDB
      執(zhí)行以下命令來安裝MongoDB:
      sudo apt-get install -y mongodb
    
    第5步:啟動(dòng)MongoDB
      執(zhí)行以下命令啟動(dòng)MongoDB并將其添加為在啟動(dòng)時(shí)啟動(dòng)的服務(wù)
      sudo systemctl start mongodb
    
        如果執(zhí)行完這一步終端沒有任何輸出金吗,則說明是正確的
        如果啟動(dòng)的時(shí)候提示:Failed to start mongod.service: Unit mongodb.service not found.
        解決辦法如下:
        1創(chuàng)建配置文件:
          cd /etc/systemd/system/
          sudo vi mongodb.service
        2.在里面追加文本:
          [Unit]
          Description=High-performance, schema-free document-oriented database
          After=network.target
          [Service]
          User=mongodb
          ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf
          [Install]
          WantedBy=multi-user.target
        3.退出
          :wq
        4.啟動(dòng)服務(wù)
          sudo systemctl start mongodb
          sudo systemctl status mongodb
        5.設(shè)置開機(jī)自啟動(dòng)
          sudo systemctl enable mongodb
    
    第6步:登錄MongoDB
        mongo
    
          如果出現(xiàn)錯(cuò)誤全局初始化失斒ぁ:BadValue無效或無用戶區(qū)域設(shè)置。 請確保LANG和/或LC_ *環(huán)境變量設(shè)置正確摇庙,請嘗試命令:
          export LC_ALL=C
    
    

三旱物、MongoDB之?dāng)?shù)據(jù)庫操作

  • 創(chuàng)建數(shù)據(jù)庫

    # mongodb
    use DATABASE_NAME
    注意:如果指定的數(shù)據(jù)庫DATABASE_NAME不存在,則該命令將創(chuàng)建一個(gè)新的數(shù)據(jù)庫卫袒,否則返回現(xiàn)有的數(shù)據(jù)庫
    
    # mysql中
    創(chuàng)建數(shù)據(jù)庫:create database basename;
    切換數(shù)據(jù)庫:use basename;
    
    

    admin:從權(quán)限的角度來說宵呛,是root的數(shù)據(jù)庫
    ? local:本地?cái)?shù)據(jù)
    ? config:配置,用于保存MongoDB的配置信息

  • 檢查當(dāng)前選擇的數(shù)據(jù)

    db
    
    

    默認(rèn)的數(shù)據(jù)庫test

  • 顯示數(shù)據(jù)庫列表

    show dbs 
    
    
  • 刪除數(shù)據(jù)庫

    // 默認(rèn)進(jìn)入數(shù)據(jù)庫是test
    db.dropDatabase()
    
    

    注意:默認(rèn)刪除當(dāng)前正在工作的數(shù)據(jù)庫

四夕凝、MongoDB之集合操作

類似于MySQL中的表烤蜕。
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu)迹冤,意味著可以對集合插入不同格式和不同類型的數(shù)據(jù),但是盡量插入集合的時(shí)候保證數(shù)據(jù)的關(guān)聯(lián)性虎忌。

  • 創(chuàng)建集合

    集合名的規(guī)范:
      a.不能空字符串
      b.集合名不能含有\(zhòng)0【空字符】泡徙,表示集合名的結(jié)尾
      c.集合名不能以"system."開頭,為系統(tǒng)集合保留的關(guān)鍵字
      d.不能含有保留字符膜蠢,千萬不能含有$
    
    語法:
      // name的類型為String堪藐,是要?jiǎng)?chuàng)建的集合的名稱
      // options的類型是Document莉兰,是一個(gè)文檔,指定相應(yīng)的大小和索引礁竞,是可選參數(shù)
      // 在插入文檔時(shí)糖荒,MongoDB首先檢查上限集合capped字段的大小,然后檢查max字段
      db.createCollection(name, options)
    
    例如:
      // 沒有options選項(xiàng)的集合創(chuàng)建
      db.createCollection("myCollection")
    
      // 有options選項(xiàng)的集合的創(chuàng)建
      db.createCollection("mycol",{capped:true,autoIndexId:true,size:1024,max:10000})
    
    
  • 顯示當(dāng)前數(shù)據(jù)庫中的集合

    show collections
    
    
  • 刪除集合

    語法:
      // 如果選定的集合成功刪除模捂,drop()方法將返回true捶朵,否則返回false
      db.COLLECTION_NAME.drop()
    
    例如:
      db.mycollection.drop()
    
    

五、MongoDB之文檔操作

  • 文檔概念
    文檔:相當(dāng)表中的一條記錄【實(shí)體】
    是一組鍵值對狂男,文檔不需要設(shè)置相同的字段综看,并且相同的字段不需要相同的數(shù)據(jù)類型

    注意: 
    a.文檔中的鍵值對是有序的
    b.文檔中值除了字符串之外,還可以是其他數(shù)據(jù)類型【嵌套一個(gè)文檔】
    c.嚴(yán)格區(qū)分大小寫和數(shù)據(jù)類型的岖食,mycol myCol
    d.文檔中不能有重復(fù)的鍵
    e.文檔中的鍵基本都是用字符串表示的
    
    
    文檔中鍵的命名:
    a.鍵不能包含\0
    b.$和.有特殊含義
    c.以下劃線開頭的鍵是保留的红碑,盡量不要使用下劃線開頭
    
    
  • 插入文檔

    語法:
      // 在插入的文檔中,如果不指定_id參數(shù)泡垃,那么 MongoDB 會(huì)為此文檔分配一個(gè)唯一的ObjectId
      // _id為集合中的每個(gè)文檔唯一的12個(gè)字節(jié)的十六進(jìn)制數(shù)析珊。
      db.COLLECTION_NAME.insert(document)
    
    例如:
      // 插入一個(gè)
      db.mycol.insert({id:101, name:'lisi', age:20})
      db.mycol.insert({ 
         item: "canvas", 
         num: 100, 
         tags: ["cotton"], 
         size: { 
              h: 20,
              w: 30, 
          } 
      })
    
      // 插入多個(gè)(注意方括號)
      db.mycol.insert( [{id:102, name:'wagnwu', age:18}, {id:103, name:'zhaoliu', age:21}, {id:104, name:'tianqi', age:19}] )
    
      // 查看已插入的文檔
      db.mycol.find()
      { "_id" : ObjectId("5b8b59cb5bd1df1fc73dcdc6"), "id" : 101, "name" : "lisi", "age" : 20 }
    
      // 查看已插入的文檔
      db.mycol.find().pretty()
      {
      "_id" : ObjectId("5b8b59cb5bd1df1fc73dcdc6"),
      "id" : 101,
      "name" : "lisi",
      "age" : 20
      }
    
    
  • 查詢文檔

    語法:
      // 基本操作
      db.COLLECTION_NAME.find(document)
       // 以格式化的方式返回查詢結(jié)果
       db.COLLECTION_NAME.find(document).pretty()
    
    注意: 
      find() 將以非結(jié)構(gòu)化的方式返回查詢結(jié)果
    
     例如: 
      // 顯示所有文檔
      db.mycol.find()
    
      // 默認(rèn)將所有文檔顯示,為了限制列表蔑穴,需要顯示的字段設(shè)置為1忠寻,不顯示的設(shè)置為0
      db.mycol.find( {'name':'liming'}, {'name':1, 'age': 1} )
      db.mycol.find( {'name':'liming'}, {'age':0} )
    
      // 限制字段顯示
      db.check.find({},{'_id':1,'title':1})
    
    
  • 查詢文檔(條件查詢)

    - 等于{ <key>:<value> }
      db.mycol.find({'name':'zyz'} ).pretty()
    
    - 小于 { <key>: {$lt:<value>} }
      db.mycol.find( {'age': {$lt:18}} ).pretty()
    
    - 小于等于 { <key>: {$lte:<value>} }
      db.mycol.find( {'age': {$lte:18}} ).pretty()
    
    - 大于 { <key>: {$gt:<value>} }
      db.mycol.find( {'age': {$gt:18}} ).pretty()
    
    - 大于等于 { <key>: {$gte:<value>} }
      db.mycol.find( {'age': {$gte:18}} ).pretty()
    
    - 不等于 { <key>: {$ne:<value>} }
      db.mycol.find( {'age': {$ne:18}} ).pretty()
    
    - 并列關(guān)系(and)
      在find()方法中,如果通過使用 ',' 將它們分開傳遞多個(gè)鍵澎剥,則 MongoDB 將其視為AND條件
      db.mycol.find(
        {
          $and: [
            {key1: value1}, {key2: value2}
          ]
        }
      )
    
    - 或者關(guān)系(or)
      db.mycol.find(
        {
          $or: [
            {key1: value1}, {key2: value2}
          ]
        }
      )
    
    
  • 更新文檔

    update()更新現(xiàn)有文檔中的值,語法:
      db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
    例如:
      // update默認(rèn)只更新一個(gè)文檔锡溯,如果要更新多個(gè)文檔,則添加參數(shù){multi:true})
      db.check.update( {'title': 'MongoDB Guide'}, {$set: {'title': 'mongo'}} )
      db.check.update( {'title': 'MongoDB Guide'}, {$set: {'title': 'mongo'}, $set: {'say': 'hello'}} )
      db.check.update( {'title': 'MongoDB Guide'}, {$set: {'title': 'mongo'}}, {multi: true} )
    
    save()用傳遞的文檔數(shù)據(jù)替換現(xiàn)有文檔哑姚,語法:  
      db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
    例如:
      db.check.save( {'_id':102, 'title':'hello', 'by':'lalala'} )  
    
    
  • 刪除文檔

    語法:
      db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
    
     例如:
       db.check.remove( {'_id':100} )
    
    

六祭饭、MongoDB之查詢

  • 投影
    查詢過程中,只顯示指定的字段

    語法:
      db.COLLECTION_NAME.find({},{KEY:1})
    
    例如:
      db.mycol.find( {}, {'title':1, _id:0} )
    
    

    在執(zhí)行find()方法時(shí)叙量,始終都會(huì)顯示_id字段倡蝙,如果不想要此字段,則需要將其設(shè)置為0

  • 限制篩選記錄

    limit()限制MongoDB要返回的記錄數(shù),根據(jù)指定的參數(shù)返回記錄數(shù)
    語法:
      db.COLLECTION_NAME.find().limit(NUMBER)
    例如: 
      // 在查詢文檔時(shí)僅顯示兩個(gè)文檔
      db.mycol.find({},{"title":1,_id:0}).limit(2)
    
    skip() 方法跳過指定數(shù)量的數(shù)據(jù)
    語法:
      // 注意:skip()方法中的默認(rèn)值為0绞佩。
      db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
    例如:
      db.mycol.find({},{"title":1,_id:0}).limit(1).skip(2)
    
    
  • 對查詢記錄排序

     語法:
        // 使用指定順序進(jìn)行排序寺鸥,1表示升序,-1表示降序
        db.COLLECTION_NAME.find().sort({KEY:1})
      例如:
         db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
    
    
  • 管道的概念
    MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理品山。管道操作是可以重復(fù)的胆建。

    $project:修改輸入文檔的結(jié)構(gòu)≈饨唬可以用來重命名笆载、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔
      db.article.aggregate( [ {$project:{by_user:1, title:1}} ] )
    
    $limit:用來限制MongoDB聚合管道返回的文檔數(shù)
      db.article.aggregate( [ {$project:{by_user:1, title:1}}, {$limit: 2} ] )  
    
    $skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔
      db.article.aggregate( [ {$project:{by_user:1, title:1}}, {$skip: 1} ] )
      db.article.aggregate( [ {$project:{by_user:1, title:1}}, {$limit:2},{$skip: 1} ] ) 
    
    $group:將集合中的文檔分組凉驻,可用于統(tǒng)計(jì)結(jié)果
      db.article.aggregate( [ {$group: {_id:'$by_user', num:{$sum:'$likes'}}} ] )
    
    $sort:將輸入文檔排序后輸出
      db.article.aggregate( [ {$group: {_id:'$by_user', num:{$sum:'$likes'}}},{$sort: {'num':-1}} ] )
    
    
  • 分組與聚合函數(shù)查詢

    aggregate()語法:
      db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
    
    - $sum 從集合中的所有文檔中求出定義的值
      // 計(jì)算每個(gè)作者所寫的文章點(diǎn)贊數(shù)
      db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
      // 計(jì)算每個(gè)作者所寫文檔數(shù)量
      // select by_user, count(*) from article group by by_user
      db.article.aggregate([ { $group: {_id:'$by_user', num:{$sum:1}} } ])
    
    - $avg 計(jì)算集合中所有文檔的所有給定值的平均值
      db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
    
    - $max 從集合中的所有文檔獲取相應(yīng)值的最大值
      // _id:'$by_user'腻要,對應(yīng)按照by_user分組
      db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
      // _id對應(yīng)一個(gè)常量,即所有數(shù)據(jù)的操作
      db.article.aggregate([ { $group:{_id:'max', num_likes:{$max:'$likes'}} } ])
    
    - $min 從集合中的所有文檔獲取相應(yīng)值的最小值
      db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
    
    - 例如:
      db.article.aggregate([{$group:{'_id':'$by_user','num_tutorial':{$sum:1}}}])
    
    

七涝登、MongoDB之關(guān)聯(lián)關(guān)系

MongoDB中的關(guān)系表示各個(gè)文檔在邏輯上的相互關(guān)聯(lián)雄家。關(guān)系可以通過嵌入式和引用方法建模。 這種關(guān)系可以是1:1胀滚,1:N趟济,N:1或N:N。

假設(shè)有一種情況:要存儲用戶的地址蛛淋。一個(gè)用戶可以擁有多個(gè)地址咙好,這就是1:N關(guān)系。

// 用戶user文檔
{
   "_id":10999110,
   "name": "Maxsu",
   "contact": "13800138000",
   "dob": "1992-10-11"
}

// 地址文檔
{
   "_id":12200,
   "building": "Hainan Building NO.2100",
   "pincode": 571100,
   "city": "Haikou",
   "province": "Hainan"
}

嵌入式關(guān)系建模
在嵌入式方法中褐荷,我們將地址(address)文檔嵌入到用戶(user)文檔中

{
   "_id": 21000100,
   "contact": "13800138000",
   "dob": "1991-11-11",
   "name": "Maxsu",
   "address": [
      {
         "building": "Hainan Building NO.2100",
         "pincode": 571100,
         "city": "Haikou",
         "province": "Hainan"
      },
      {
         "building": "Sanya Building NO.2100",
         "pincode": 572200,
         "city": "Sanya",
         "province": "Hainan"
      },
   ]
}

該方法將所有相關(guān)數(shù)據(jù)保存在單個(gè)文檔中勾效,這使得檢索和維護(hù)更容易。
可以使用單個(gè)查詢來在整個(gè)文檔檢索:
 db.users.find( {"name":"Maxsu"},{"address":1, "name":1} )

在上述查詢中叛甫,db和users分別是數(shù)據(jù)庫和集合层宫。缺點(diǎn)是如果嵌入式文檔的大小如果不斷增長,可能會(huì)影響讀/寫性能其监。

建模參考關(guān)系
這是設(shè)計(jì)規(guī)范化關(guān)系的方法萌腿。 
在這種方法中,用戶和地址文件將分別維護(hù)抖苦,但用戶文檔將包含一個(gè)將引用地址文檔的id字段的字段毁菱。
{
   "_id":ObjectId("52ffc33321332111sdfaf"),
   "contact": "13800138000",
   "dob": "1991-11-11",
   "name": "Maxsu",
   "address_ids": [
      ObjectId("123123"),
      ObjectId("123412")
   ]
}
用戶文檔包含對應(yīng)地址的ObjectId的數(shù)組字段address_ids。 
使用這些ObjectIds锌历,我們可以從那里查詢地址文件并獲取地址詳細(xì)信息贮庞。 
使用這種方法,需要兩個(gè)查詢:首先從用戶文檔獲取address_ids字段究西,然后從地址集中獲取這些地址窗慎。
var result = db.users.find({"name":"Maxsu"},{"address_ids":1})
var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

八、MongoDB與Python的交互

- 安裝
pip3 install pymongo

- 使用
import pymongo
from pymongo import  MongoClient
from bson.objectid import ObjectId

#1.建立連接
#創(chuàng)建MongoClient的對象
#方式一
#特點(diǎn):可以連接默認(rèn)的主機(jī)和端口號
#client = MongoClient()
#方式二
#明確指明主機(jī)和端口號
#client = MongoClient('localhost',27017)
#client = MongoClient(host='localhost',port=27017)
#方式三
#使用MongoDB URI的
client = MongoClient('mongodb://localhost:27017')

#2.獲取數(shù)據(jù)庫
#MongoDB的一個(gè)實(shí)例可以支持多個(gè)獨(dú)立的數(shù)據(jù)庫
#可以通過MongoClient的對象的屬性來訪問數(shù)據(jù)庫
#方式一
db = client.test
print(db)
#方式二
#db = client['test']

#3.獲取集合
#集合是存儲在MongoDb中的一組文檔卤材,可以類似于MySQl中的表
#方式一
collection = db.stuents
#方式二
#collection = db['students']
"""
注意:
MongoDB中關(guān)于數(shù)據(jù)庫和集合的創(chuàng)建都是懶創(chuàng)建
以上的操作在MongoDB的服務(wù)端沒有做任何操作
當(dāng)?shù)谝粋€(gè)文檔被插入集合的時(shí)候才會(huì)創(chuàng)建數(shù)據(jù)庫和集合
"""

#4.文檔
#在pymongo中使用字典來表示文檔
student1 = {
    'id':'20180101',
    'name':'jack',
    'age':20,
    'gender':'male'
}

#5.插入文檔
#5.1insert()
#插入單條數(shù)據(jù)
#注意:MongoDb會(huì)自動(dòng)生成一個(gè)ObjectId,insert函數(shù)的返回值為objectid
result = collection.insert(student1)
print(result)

#插入多條數(shù)據(jù)
student2 = {
    'id':'20180530',
    'name':'tom',
    'age':30,
    'gender':'male'
}
student3 = {
    'id':'20180101',
    'name':'bob',
    'age':18,
    'gender':'male'
}
#result = collection.insert([student2,student3])

#6.查詢文檔
#6.1
#find_one()
result = collection.find_one({'name':'jack'})
print(type(result))    #<class 'dict'>
print(result)

#6.2find()
#需求:查詢年齡為20的數(shù)據(jù)
results = collection.find({'age':20})
print(results)
#Cursor相當(dāng)于是一個(gè)生成器遮斥,只能通過遍歷的方式獲取其中的數(shù)據(jù)
for r in results:
    print(r)

#6.3其他用法
#a.count()
#統(tǒng)計(jì)所有數(shù)據(jù)的條數(shù)
count1 = collection.find().count()
#統(tǒng)計(jì)制定條件的數(shù)據(jù)條數(shù)
count1 = collection.find({'age':20}).count()

#7.更新文檔
#7.1update()
conditon = {'name':'jack'}
student = collection.find_one(conditon);
student['age'] = 30
result = collection.update(conditon,student)

#7.2update_one()
conditon = {'name':'jack'}
student = collection.find_one(conditon);
student['age'] = 30
result = collection.update_one(conditon,{'$set':student})
print(result.matched_count,result.modified_count)

#7.3update_many()
#查詢年齡大于20的數(shù)據(jù),然后講年齡增加1
conditon = {'age':{'$gt':20}}
result = collection.update_one(conditon,{'$inc':{'age':1}})
print(result.matched_count,result.modified_count)

#8.刪除文檔
#8.1remove()
#將符合條件的所有的數(shù)據(jù)全部刪除
result = collection.remove({'name':'rose'})

#8.2delete_one()
result = collection.delete_one({'name':'rose'})

#8.3delete_many()
result = collection.delete_many({'name':'rose'})

備注: 默認(rèn)MongoDB是綁定127.0.0.1扇丛,連接遠(yuǎn)程是連接不了的术吗。
編輯MongoDB配置文件: sudo vi /etc/mongodb.conf
找到 bind_ip = 127.0.0.1 改為 bind_ip = 0.0.0.0

作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處帆精。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藐翎,一起剝皮案震驚了整個(gè)濱河市材蹬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吝镣,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昆庇,死亡現(xiàn)場離奇詭異末贾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)整吆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拱撵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人表蝙,你說我怎么就攤上這事拴测。” “怎么了府蛇?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵集索,是天一觀的道長。 經(jīng)常有香客問我汇跨,道長务荆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任穷遂,我火速辦了婚禮函匕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚪黑。我一直安慰自己盅惜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布忌穿。 她就那樣靜靜地躺著抒寂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伴网。 梳的紋絲不亂的頭發(fā)上蓬推,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音澡腾,去河邊找鬼沸伏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛动分,可吹牛的內(nèi)容都是我干的毅糟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼澜公,長吁一口氣:“原來是場噩夢啊……” “哼姆另!你這毒婦竟也來了喇肋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤迹辐,失蹤者是張志新(化名)和其女友劉穎蝶防,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體明吩,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡间学,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了印荔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片低葫。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仍律,靈堂內(nèi)的尸體忽然破棺而出嘿悬,到底是詐尸還是另有隱情,我是刑警寧澤水泉,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布善涨,位于F島的核電站,受9級特大地震影響茶行,放射性物質(zhì)發(fā)生泄漏躯概。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一畔师、第九天 我趴在偏房一處隱蔽的房頂上張望娶靡。 院中可真熱鬧,春花似錦看锉、人聲如沸姿锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻此。三九已至,卻和暖如春腔寡,著一層夾襖步出監(jiān)牢的瞬間焚鲜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工放前, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忿磅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓凭语,卻偏偏與公主長得像葱她,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子似扔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一吨些、MongoDB簡介 概述MongoDB是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫搓谆,由C++語言編寫。旨在為WEB應(yīng)用提供...
    EndEvent閱讀 1,163評論 1 4
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,928評論 2 89
  • 一豪墅、MongoDB簡介 概述MongoDB是一個(gè)基于分布式文件存儲的數(shù)據(jù)庫泉手,由C++語言編寫。旨在為WEB應(yīng)用提供...
    fly5閱讀 286評論 0 0
  • 簡介 MongoDB 是一個(gè)基于分布式文件存儲的NoSQL數(shù)據(jù)庫 由C++語言編寫偶器,運(yùn)行穩(wěn)定螃诅,性能高 旨在為 WE...
    大熊_7d48閱讀 36,815評論 1 9
  • 一、MongoDB介紹 1状囱、NoSQL:非關(guān)系型數(shù)據(jù)庫 在php的世界里,常見的非關(guān)系型數(shù)據(jù)庫有memcached...
    寵辱不驚丶?xì)q月靜好閱讀 635評論 0 3