Mongodb最基礎入門教程

来源:https://www.cnblogs.com/xiaohuiduan/archive/2019/08/24/11403891.html
-Advertisement-
Play Games

Mongodb最基礎入門教程 如果想瞭解一下redis的入門教程,可以去看一下我的上一篇博客 Mongodb的安裝大家可以參考一下其他博主的博客,這裡我就不做介紹了。不過值得註意的是,在Linux版本中如果啟動mongodb的時候出現下麵這個錯誤(在windows版本中不會出現下麵的問題): mon ...


 

Mongodb最基礎入門教程

如果想瞭解一下redis的入門教程,可以去看一下我的上一篇博客

Mongodb的安裝大家可以參考一下其他博主的博客,這裡我就不做介紹了。不過值得註意的是,在Linux版本中如果啟動mongodb的時候出現下麵這個錯誤(在windows版本中不會出現下麵的問題):

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文件夾需要賦予可讀寫的許可權)

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

簡介

Mongodb是一種非關係性資料庫(nosql),關於nosql的介紹可以去看一看菜鳥教程

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

下麵是Sql與mongodb的術語對比

SQLMongodb
表(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
}

同樣我們也可以在這個資料庫插入這樣的數據。

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

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

 


 

 

通過這個我們知道,在向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


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

-Advertisement-
Play Games
更多相關文章
  • [20190823]關於CPU成本計算2.txt--//前幾天探究CPU cost時遇到的問題,獲取行成本時我的測試查詢結果出現跳躍,不知道為什麼,感覺有點奇怪,分析看看。--//ITPUB原始鏈接已經不存在,我的日記本還有記錄,現在想想當時的記錄思路很亂,不過這些都是猜測的過程,以前思路混亂也是正 ...
  • 前言: 前面幾篇文章為大家介紹了各種SQL語法的使用,本篇文章將主要介紹MySQL用戶及許可權相關知識,如果你不是DBA的話可能平時用的不多,但是瞭解下也是好處多多。 1.創建用戶 官方推薦創建語法為: 通常我們常用的創建語法為: 語法說明如下: 1) 指定創建用戶賬號,格式為 'user_name' ...
  • /*the waiting game:儘管人生如此艱難,不要放棄;不要妥協;不要失去希望*/ 隨著MySQL MGR的版本的升級以及技術成熟,在把MHA拉下神壇之後, MGR越來越成為MySQL高可用的首選方案。MGR的搭建並不算很複雜,但是有一系列手工操作步驟,為了簡便MGR的搭建和故障診斷,這裡 ...
  • datanode無法連接到namenode namenode在清空hadoop.tmp.dir和namenode.dir文件夾重新格式化後,datanode還是無法連接到namenode並報錯: hdfs.server.datanode.DataNode: Problem connecting to ...
  • 一、集群規劃 這裡搭建一個 3 節點的 HBase 集群,其中三台主機上均為 。同時為了保證高可用,除了在 hadoop001 上部署主 服務外,還在 hadoop002 上部署備用的 服務。Master 服務由 Zookeeper 集群進行協調管理,如果主 不可用,則備用 會成為新的主 。 二、前 ...
  • MySQL常見的8種SQL錯誤用法 前言 MySQL在2016年仍然保持強勁的資料庫流行度增長趨勢。越來越多的客戶將自己的應用建立在MySQL資料庫之上,甚至是從Oracle遷移到MySQL上來。但也存在部分客戶在使用MySQL資料庫的過程中遇到一些比如響應時間慢,CPU打滿等情況。 阿裡雲RDS專 ...
  • SQL單表查詢 一、單表查詢的語法 select列名1,列名2... from 表名 where 條件 group by field having 篩選 order by field limit 限制條數 二、關鍵字的執行優先順序 from where group by having select d ...
  • Explain工具介紹 使用EXPLAIN關鍵字可以模擬優化器執行SQL語句,分析查詢語句或是結構的性能瓶頸。在select語句之前增加explaion關鍵字,MySQL會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是執行SQL。 Explaion分析示例 actor建表語句: CREA ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...