非關系型數據庫MongoDB入門


  本文分為以下四塊簡單介紹非關系型數據庫MongoDB:1.MongoDB簡介、2.MongoDB和關系數據庫對比、3.MongoDB基本概念、4.mongo shell的使用以及對MongoDB的增刪改查操作

Ⅰ、MongoDB簡介

  MongoDB是一款基於分布式文件存儲的數據庫,是一種文檔型數據庫,是介於關系型和非關系型數據庫之間的產品,是最接近關系型數據庫的數據庫。MongoDB中的每一條記錄就是一個文檔,是一個數據結構,由字段和值對組成,字段的值可能其他文檔,數組,以及文檔數組。一般用作離線數據分析使用,放在內網居多,提供高性能的數據持久化。

II、MongoDB和關系數據庫對比

Ⅲ、MongoDB基本概念

    • 集合(collection)就是一組文檔,如果說MongoDB中的文檔類似於關系型數據庫中的行,那么集合就如同表。
    • 文檔(document)是MongoDB中數據的基本單元,非常類似於關系型數據庫系統中的行(但是比行要復雜的多)。
    • MongoDB的單個計算機可以容納多個獨立的數據庫,每一個數據庫都有自己的集合和權限。
    • MongoDB自帶簡潔但功能強大的JavaScript shell,這個工具對於管理MongoDB實例和操作數據作用非常大。
    • 每一個文檔都有一個特殊的鍵”_id”,它在文檔所處的集合中是唯一的,相當於關系數據庫中的表的主鍵。

Ⅳ、mongo shell的使用以及對MongoDB的增刪改查操作

⑴ mongo shell的使用

  安裝好MongoDB后我們開始mongo Shell在數據庫運行的情況下進入我們MongoDB的安裝目錄下的mongo.exe可以直接打開mongo Shell

    db :顯示當前正在使用的數據庫

    use  <db> :進行當前使用的數據庫切換

    show  dbs :顯示當前所有可用的數據庫

    要在不切換當前數據庫訪問其他的數據庫使用 db.getSiblingDB() 方法。

    當切換到一個不存在的數據庫在第一次插入數據時會進行數據庫的創建操作

    如果mongo Shell不接受我們輸入的集合名稱可以使用代替語法來代替:比如我們名稱中包含空格或連字符”-”,或者以數字開始:若我們想要對集合名稱為3test的集合進行操作則輸入以下替代語法:

      db[“3test”].find() 或者 db.getCollection(“3test”).find()

⑵  MongoDB數據庫文檔的增刪改查操作

  ① 插入文檔:

  文檔的數據結構和json基本一樣,所存儲在集合中的數據都是BSON格式(即JSON的一種二進制的存儲格式,又稱Binary JSON)插入文檔使用如下函數:


   collection表示集合的名稱,插入時若此名稱集合不存在則會自動創建此集合。若在插入操作中未指定_id字段,MongoDB會自動添加_id字段。

  ②  查詢文檔:

  查詢文檔使用find方法:

    db.collection.find( <query filter>, <projection> )其中參數<query filter>是過濾條件,指明返回哪些文檔,<projection> 指明返回文檔的哪些字段,限制了返回數據量。

  <query filter>參數的兩種方式<field>:<value>形式和使用查詢操作符<field1>: { <operator1>: <value1> }的形式

    • db.users.find( { status: "A" } )   ==>   users集合中檢索status字段值為A的所有文檔
    • db.users.find( { status: { $in: [ "P", "D" ] } } )  ==>  users集合中檢索字段為”p”和”D”的所有文檔

  指定and條件:在集合users中查找出status等於”A”age小於30的所有文檔

    db.users.find( { status: "A", age: { $lt: 30 } } )

  指定or條件:在集合users中查找出所有status等於”A”或者age小於30的所有文檔

    db.users.find({

      $or: [ { status: "A" }, { age: { $lt: 30 } } ]

    })

  指定andor條件:在集合users中查找出status等於”A”並且要么age小於30要么type等於1的所有文檔

    db.users.find({

      status: "A",

      $or: [ { age: { $lt: 30 } }, { type: 1 } ]

    })

  嵌入文檔查詢:

    嵌入文檔上的精確匹配:users集合中查找出所有favorities字段只以該種順序且只包含artist等於"Picasso"food等於 "pizza"的所有內嵌文檔

      db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )

    嵌入文檔中字段等於匹配:查詢所有favorities字段中含有artist等於"Picasso"(這里可能含有其他的字段)的內嵌文檔

      db.users.find( { "favorites.artist": "Picasso" } )

  數組上的查詢:(類似於嵌套文檔的查詢)

    數組上的精確匹配:查詢出所有badges字段是一個正好只有有"blue", "black" 這兩個這種順序的元素的數組的所有文檔

      db.users.find( { badges: [ "blue", "black" ] } )

    匹配一個數組元素:查找users集合中badges字段數組中包含”black”元素(可能包含其他元素)的所有文檔

      db.users.find( { badges: "black" } )

    匹配數組中指定的元素:查找出users集合中badges數組的第一個元素等於”black”的所有文檔

      db.users.find( { "badges.0": "black" } )

    指定數組元素多個查詢條件單個數組元素滿足查詢條件需要使用$elemMatch:查找出集合usersfinished數組中至少有一個元素大於15並且小於20的所有文檔

      db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )

    元素組合滿足條件:查找出users集合中一個元素大於15的同時另一個元素小於20或者有一個元素同時滿足大於15小於20的所有的文檔

      db.users.find( { finished: { $gt: 15, $lt: 20 } } )

  嵌入文檔數組查詢:

    使用數組索引匹配嵌入文檔中的字段:查找出points數組第一個文檔元素中的points字段小於等於55的所有文檔

      db.users.find( { 'points.0.points': { $lte: 55 } } )

    不指定索引匹配字段:查找出points數組中至少有一個嵌入文檔的points字段小於或等於55的所有文檔。

      db.users.find( { 'points.points': { $lte: 55 } } )

  指定數組文檔的多個查詢條件:

    單個元素滿足查詢條件(使用$elemMatch):查詢users集合中points數組中至少有一個內嵌文檔的points字段小於等於70並且bonus等於20的所有文檔

      db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )

    元素組合滿足查詢條件:查詢users集合中points數組中的一個內嵌文檔的points字段小於等於70並且同時另一個內嵌文檔的bonus等於20或者有一個內嵌文檔同時滿足以上兩個條件的所有文檔。

      db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )

  查找為null或者不存在的字段:

    不能使用db.users.find( { name: null } ),這樣會同時返回name字段等於null和不存在name字段的所有文檔

    使用類型篩查查找為null的文檔:db.users.find( { name : { $type: 10 } } ) => 只查找name字段為null的所有文檔

    使用存在性篩查不存在字段的所有文檔:db.users.find( { name : { $exists: false } } ) =>查找出不存在name字段的所有文檔

==========================================================================================

 上面講完了查詢的匹配條件,接下來是查詢結果映射:也就是find函數第二個參數的意義

  返回查詢的映射字段:上面我們查詢方法中的 <projection>文檔,映射文檔用來指明返回結果中包括和排除哪些字段,下面是<projection>文檔(find方法的第二個參數)

{ field1: <value>, field2: <value> ... }

  其中field字段名稱<value>的值為1true表示在返回的文檔中包含此字段,<value>的值為0或者false則返回的文檔中不會包含此字段。若不顯示指明_id的顯示或隱藏則會默認返回文檔中會包含_id字段,一個<projection>文檔不能同時指定包括和排除的字段,除了排除_id字段,在顯式包括字段的映射中_id字段是唯一一個可以顯式排除的字段。

    1. 查詢返回users集合中status值為”A”的所有文檔包含文檔的所有字段

      (1) db.users.find( { status: "A" } )

    2.    在查詢的結果集中只返回匹配文檔的namestatus以及默認的_id字段,同時也可以顯式排除_id字段

      (1) db.users.find( { status: "A" }, { name: 1, status: 1 } )

      (2) db.users.find( { status: "A" }, { name: 1, status: 1, _id: 0 } )

    3.    返回排除字段之外的所有的字段:返回favoritespoints字段外所有字段

      (1) db.users.find( { status: "A" }, { favorites: 0, points: 0 } )

    4.    返回嵌入文檔中指定字段和排除嵌入文檔中的字段:(1)返回_id,status,name,和嵌入文檔favorites中的food字段food字段仍然在嵌入文檔favorites中。(2)返回排除嵌入文檔favoritesfood外的所有字段

      (1) db.users.find({ status: "A" },{ name: 1, status: 1, "favorites.food": 1 })

      (2) db.users.find({ status: "A" },{ "favorites.food": 0 })

     5.    映射數組中的嵌入文檔:返回namestatus字段以及points數組文檔中包含bonus字段的文檔

      (1) db.users.find( { status: "A" }, { name: 1, status: 1, "points.bonus": 1 } )

    6.    映射返回數組中特定的數組元素MongoDB包含下面映射操作符$elemMatch,$slice,以及$,他們是用來返回指定防范會數組中包含映射元素的唯一方式,不能使用數組索引來映射指定元素

==========================================================================================

  ③更新文檔:

  上面的更新方法傳入的參數如下:
    (1) 過濾條件文檔:類似於sqlwhere決定更些哪些文檔      

    (2) 更新文檔:類似於sqlset指定要執行的修改或替換文檔

    (3) 選項文檔:若包含upserttrue,當沒有匹配到文檔則會創建一個新文檔並插入字段

  更新文檔中指定的字段:

    使用$set操作符更新favorites.artist字段為"Pisanello",更新type字段值為3.

    使用$currentDate 操作符更新 lastModified 字段的值到當前日期。如果 lastModified 字段不存在, $currentDate 會創建該字段。下面若使用updateOne函數則只會更新匹配得到的第一個文檔

      db.users.updateMany(  

        { "favorites.artist": "Picasso" },

          {

            $set: { "favorites.artist": "Pisanello", type: 3 },

            $currentDate: { lastModified: true }

        }

      )

    若使用update函數來進行更新操作,則需要在選項文檔中添加multi:true來指定更新單條還是所有的數據,默認更新單條數據

      db.users.update(

        { "favorites.artist": "Pisanello" },

        {

          $set: { "favorites.food": "pizza", type: 0,  },

          $currentDate: { lastModified: true }

        },

        { multi: true }

      )

  文檔替換:

    使用replaceOne函數進行替換操作:將nameabc匹配到的第一個文檔替換為新文檔

      db.users.replaceOne(

        { name: "abc" },

        { name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }

      )

    若update函數不使用操作符則會執行替換操作

      db.users.update(

        { name: "xyz" },

        { name: "mee", age: 25, type: 1, status: "A", favorites: { "artist": "Mati", food: "ma" } }

      )

    注意:替換文檔可以不同於原文檔的字段。在替換文檔中由於_id字段是不變的所以可以省略_id字段,若包含,則值必須和當前值相同

==========================================================================================

  ④刪除文檔:


  上面的過濾參數和查詢的時候相同,
remove方法將<justone>參數設置為1來刪除匹配到的第一個文檔,默認會刪除所有匹配到的文檔

  MongoDB入門教程到此結束,接下來會有MongoDB和springboot項目的集成使用案例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM