Mongodb最基礎入門教程

 

Mongodb最基礎入門教程

若是想了解一下redis的入門教程,能夠去看一下個人上一篇博客html

Mongodb的安裝你們能夠參考一下其餘博主的博客,這裏我就不作介紹了。不過值得注意的是,在Linux版本中若是啓動mongodb的時候出現下面這個錯誤(在windows版本中不會出現下面的問題):java

mongod: /usr/lib/libcurl.so.4: version `CURL_OPENSSL_3' not found (required by mongod)

緣由是由於mongodb啓動須要的是libcurl.so.3。在咱們安裝好libcurl.so.3後,咱們可使用下面的命令打開,其中LD_PRELOAD後面跟隨的是庫的位置。(/data/db文件夾須要賦予可讀寫的權限)redis

LD_PRELOAD=/usr/lib/libcurl.so.3 mongod --dbpath /data/dblll

簡介

Mongodb是一種非關係性數據庫(nosql),關於nosql的介紹能夠去看一看菜鳥教程sql

MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。mongodb

下面是Sql與mongodb的術語對比shell

SQL Mongodb
表(Talbe) 集合(Collection)
行(Row) 文檔(Document)
列(Col) 字段(Field)
主鍵(Primary Key) 對象ID(ObjectId)
索引(Index) 索引(Index)
嵌套表(Embeded Table) 嵌入式文檔(Embeded Document)
數組(Array) 數組(Array)

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。在Mongodb中,對於插入的格式並無要求,字段類型能夠隨意變更。例如,在我建立一個集合後,咱們能夠在這個集合加入下面的數據:數據庫

{
    "name":"this is a name",
    "age":12
}

一樣咱們也能夠在這個數據庫插入這樣的數據。json

{
    "name":8888,
    "address":"changsha"
}

當插入這兩個數據後,使用Robo3T數據庫可視化工具顯示以下:windows

 


 

 

經過這個咱們知道,在向mongodb的同一個表中插入數據的時候,插入的數據字段類型能夠不同,即便是相同的字段數據類型也能夠不同。數組

不過即便mongodb能夠這樣作,也可以這樣作,可是卻不是咱們應該這樣作的理由,咱們在設計數據庫的時候,應儘可能提早考慮好數據庫應有的字段,同時每個字段應該使用同一種數據類型,這樣咱們才能牢牢的將程序o把握在咱們的手裏面。

插入數據

首先咱們先建立一個名字爲test_data_1的集合。

插入一條文檔

db.getCollection('test_data_1').insertOne(
    {
        "name":8888,
        "address":"changsha"
    }
)

固然,將這一條語句寫成一行也是沒有問題的。其中,Key(也就是上面的name和address)是能夠不帶引號的,同時對於字符串也可使用單引號,不過爲了統一,在後面統一使用雙引號。

下面是執行這一條數據返回的結果

{
    "acknowledged" : true,
    "insertedId" : ObjectId("5d5f9e5c0336f9e82b3f9d74")
}

其中acknowledged表明數據是否被認可。其中,每一條數據被插入的時候都會返回一個字段「_id」,也就是ObjectId,它是由時間、機器碼、進程pid和自增計數器構成的。「_id」始終遞增,並絕對不重複。

插入多個文檔

mongodb也同時支持一次插入多個文檔

db.getCollection('test_data_1').insertMany([
        {
            "name":"名字1",
        },
        {
            "name":"名字2",
        },
        {
            "address":"湖南"
        },
    ]
)

這裏咱們又能夠想想,咱們是否可使用insertOne實現insertMany的功能?確定是能夠的,可是會形成什麼影響呢?咱們能夠從網絡帶寬,磁盤IO,機器性能,以及穩定性來考慮。

在插入相同大小的數據時,使用insertMany的性能要明顯好於insertOne,由於insertOne會頻繁的調用去插入數據,而insertMany卻只會調用一次。若是mangodb數據庫與調用者不在同一臺機器上,那麼性能相差便會更大,由於數據在網絡傳輸的過程當中會添加其餘的報文。那麼插入數據的時候是否是應該將數據所有一次插入呢?也不是!!試想一下,若是插入的數據過多,將磁盤的IO佔滿了,那麼必會對其餘程序形成影響。而且,若是在快要插入完全部數據的時候,服務器斷電了,那麼……因此說,應該合理的選擇一次性插入數據庫的數量。

查詢數據

查詢全部數據

db.getCollection('test_data_1').find({})

其中{}裏面包含的是查詢條件,由於是查詢全部的數據,因此直接爲空就好了,或者省略{}也行。

查詢特定的數據

db.getCollection('test_data_1').find({"字段1":"固定值1","字段2":"固定值2"})

 


 

 

查詢範圍值數據

下面是查詢i範圍值的語法,至於操做符,咱們後面再說。

db.getCollection('test_data_1').find(
    {
        "字段1":{"操做符1":邊界1,"操做符2":邊界2},
     	"字段2":{"操做符1":邊界1,"操做符2":邊界2}
    }
)

查詢範圍值的數據簡單,舉一個示例:

 


 

 

和前面查詢特定的數據的方法同樣,只不過固定值變成了範圍({"$gt":10}表明大於10)。

下面是範圍操做符及其意義:

操做符 意義
$gt 大於(great than)
$gte 大於等於(great than equal)
$lt 小於(less than)
$lte 小於等於(less than equal)
$ne 不等於(not equal)

限定返回字段

在前面的幾張圖片中,咱們能夠看到,使用find操做的時候,返回了全部的字段,那麼若是咱們並不想要某一些字段的時候,咱們應該怎麼作呢?

db.getCollection('test_data_1').find(用於過濾的條件,用於限定的條件)

下面即是兩個例子:

  • 去除age

  • 只返回age

你們會發現,在後面的用於限定的條件中,若是age爲1,則返回了age和**_id**,若是age爲0,則返回了**_idname**。在不考慮_id的狀況下,咱們能夠理解:

若是某一個字段被限定爲0,則表明該字段不返回(也就是默認其它字段爲1),因此其餘未被限定的字段則必定會被返回

若是某一個字段被限定爲1,則表明該字段返回(也就是默認其它字段爲0),因此其餘未被限定的字段則不會被返回

_id比較特殊,不管怎樣,都要默認返回,當是若是咱們真的不須要,那麼必須就要把"_id"設置爲0。

修飾返回結果

  1. 獲得數據的條數

    db.getCollection('test_data_1').find({}).count()
  2. 限定返回結果數量

    db.getCollection('test_data_1').find({}).limit(限制返回的數量)
  3. 對結果進行排序

    db.getCollection('test_data_1').find({}).sort({"字段名":-1或者1})

    其中-1爲逆序,1爲正序。

修改數據

修改數據的前一部分是須要找到數據,而後才能進行修改。一樣,在mongodb中,有兩種方法修改數據(實際上有不少種)

  • updateOne:只更新第一條符合條件的數據
  • updateMany:更新全部符合條件的數據

下面介紹updateMany的更新數據

db.getCollection('test_data_1').updateMany(
    // 下面是查詢條件
    { 
       "字段名1":"查找條件1","字段名2":"查找條件2"
     },
   // 進行修改
    {
        "$set":{"字段名":"新的數據","字段名":"新的數據"}
    } 
)

其中,若是在進行在進行修改的步驟中,若是字段名之前不存在則會進行增添。

固然,更新數據的內容不可能就這麼一點點,可是由於這僅僅是一個基礎入門教程,其餘的就拜拜吧!想了解更多能夠去看看其餘的教程。

刪除數據

刪除數據也有兩種操做,deleteOnedeleteMany。和修改數據的狀況差很少,一個是刪除第一條知足條件的,一個是刪除全部知足條件的。

仍是以deleteMany來講:

db.getCollection('test_data_1').deleteMany(
    // 刪除的條件
    {
        "字段名1":"值","字段名2":"值2"
    }
)

說完簡單的mongodb的操做(增刪改查)咱們如今能夠來講一說稍微複雜一點點的操做了。

數據去重

在mongodb中進行數據去重是一個很簡單的操做。使用distinct便可。它能夠接收兩個參數,第一個參數爲須要被去重的字段名,第二個參數是進行去重的條件(去重條件也就是進行查詢操做的第一個參數,能夠省略)。

db.getCollection('test_data_1').distinct(去重的字段名,去重的條件)

下面舉個例子:

db.getCollection('test_data_1').distinct("name",{"age":{"$ne":10}})

這個的含義就是,在age不等於10的條件下對name字段進行去重!那麼返回的數據是什麼呢?是一個數組,裏面是去重後的表中name字段的非重複的數據。

 


 

 

注意:這個去重是對返回值去重,而不是對數據庫裏面數據去重,也就是說,執行了這個操做,數據庫沒有發生任何改變。

在這一章只介紹了mongodb的最最基礎的一些東西,原本是想介紹一下Mongodb的其餘操做,可是發現其餘的操做稍微要複雜一點,因此準備在下一章寫。這一章的介紹就介紹到這裏,下一篇博客我將介紹一下Mongodb的其餘操做。

參考

參考書籍:《左手Mongodb,右手Redis》

菜鳥教程:https://www.runoob.com/mongodb/mongodb-tutorial.html

相關文章
相關標籤/搜索