MongoDB學習(操作集合中的文檔)

来源:https://www.cnblogs.com/shangyang/archive/2019/04/05/10649786.html
-Advertisement-
Play Games

mongodb對集合文檔的操作,添加文檔、查看文檔、刪除文檔、更新文檔及常用的局部更新運算符 ...


文檔概念

  文檔的數據結構和JSON基本一樣。

  所有存儲在集合中的數據都是BSON格式。

  BSON是一種類json的一種二進位形式的存儲格式,簡稱Binary JSON。

 

插入文檔

insert()方法

  要將數據插入到 MongoDB 集合中,可以使用 insert() 方法。

db.collection_name.insert(document)

  

  其中test為集合名。如果資料庫中不存在集合,則MongoDB將創建此集合,並將文檔插入到該集合中。

  在插入的文檔中,如果不指定 _id 參數,MongoDB會為此文檔分配一個唯一的Object_id。

  _id 為集合中的每一個文檔的12個位元組的十六進位數。12 位元組劃分為:

id: ObjectId( 4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)

 

  要在單個語句中插入多個文檔,可以在 insert() 命令中傳遞文檔數組。

1 > db.test.insert([
2 ... {name:"uzi",
3 ... like:["MongoDB","JAVA","Database"],
4 ... },
5 ... {name:"957",
6 ... parents:[{
7 ... father:"letme",
8 ... mather:"mlxg"}],}])
添加代碼

save()方法

  要插入文檔,也可以使用 db.collection_name.save() 方法。與 insert() 方法不同的是,當輸入的id值相同時, insert() 方法無法插入,但 save() 方法會更新包含 該 id 值的文檔的全部數據。

insertOne()方法

  db.collection_name.insertOne() 方法將單個文檔插入到集合中。如果沒有指定 _id ,MongoDB會自動將添加。

  該方法會返回包含新插入的文檔的 ”_id"欄位值的文檔。

insertMany()方法

  db.collection_name.insertMany() 方法可以將多個文檔插入到集合中。如果沒有指定 _id,則自動添加ObjectId

更新文檔

更新運算符

  在MongoDB中進行更新操作時,可以使用運算符進行文檔數據的局部修改。

運算符 描述 語法
$set 更新欄位的值,如果欄位不存在則進行添加 { $set : { field : value } }
$inc 

將欄位值增加指定的量

{ $inc : { field : value } }

$rename

重命名欄位名(鍵名)

{ $rename : { field : value } }

$unset

刪除指定的欄位(鍵)

 { $unset : { field : "1" } }
$setOnInsert

在更新操作中新建文檔時設置欄位的值

{ $setOnInsert : { field : value } }
$addToSet

在已有數組中添加元素,如果元素存在則不操作

{ $addToSet : { field : value } }
$pop

刪除數組的第一個或最後一個元素。如果值為“-1",則刪除第一個元素;

如果值為”1",則刪除最後一個元素。

{ $pop : { field : value } }
$push

1.如果指定的鍵是數組則追加新的值;

2.如果指定的鍵不是數組則無法成功執行

3.如果不存在指定的欄位(鍵)則創建數組類型的鍵值對

{ $push : { field : value } }
$pushAll

用法與 $push 類似,一次可以添加多個值到數組

{ $pushAll : { field : [ value1,value2,...] } }
$pull

從數組中刪除指定值

{ $pull : { field : value } }
$pullAll

從數組中刪除多個值,要刪除的值是以數組指定的

{ $pullAll : { field : [ value1,value2,...] } }
$each

用於運算符$push和$addToSet 的限定符,用於在數組中添加多個單獨的元素,防止直接添加進數組元素

 field : { $each : [ value1,...] }
$slice

用於運算符 $push 的限定符,用於限制更新後的數組長度

field : { $slice : < num > }
$sort

用於運算符 $push 的限定符,用於將數組中的文檔重新排序

 
$bit

對整數值執行按位與和或運算。

 

更新方法 update()

  Collection 對象的 update() 方法可以更新集合中的文檔。

    db.collection.update(    
        <query>, 
        <update>, 
        {       
            upsert: <boolean>,   
            multi: <boolean>,  
            writeConcern: <document>
        }
    )

   參數說明:

  •   query:查詢條件,類似sql update查詢內where後面的條件。
  •   update:要更新的內容和一些更新的操作符(如 $set...)等,類似sql update查詢內set後面的參數。
  •   upsert:可選。參數upsert是個布爾值,如果為 true 且沒有文檔與查詢匹配,則插入一個新文檔;如果為 false 則不插入。 預設為 false。
  •   multi:可選。mongodb 預設是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來的多條記錄全部更新。
  •   writeConcern:可選。拋出異常的級別。

  註意:如果不使用運算符,則update內容不會進行局部修改,而是全局修改。

  示例:

    

 1 #將name為uzi的學生的age加5
 2 db.student.update({name:"uzi"},{$inc:{age:5}})
 3 
 4 #把uzi的sex改為boy
 5 db.student.update({name:"uzi"},{$set:{sex:"boy"}})
 6 
 7 #把uzi的like欄位刪除
 8 db.student.update({name:"uzi"},{$unset:{like:1}})
 9 
10 #給uzi的添加別名dog
11 db.student.update({name:"uzi"},{$push:{aname:"dog"}})
12 
13 #給uzi添加多個別名
14 db.student.update({name:"uzi"},{$pushAll:{aname:["A1","A2"]}})
15 
16 #給uzi的別名數組裡再添加一個數組
17 db.student.update({name:"uzi‘},{$addToSet:{aname:["A3","A4"]}})
18 
19 #刪除別名數組內第一個別名
20 db.student.update({name:"uzi"},{$pop:{aname:-1}})
21 
22 #刪除別名 A2
23 db.student.update({name:"uzi"},{$pull:{aname:"A2"}})
局部更新語句示例

save() 方法

  save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:

    db.collection.save(    
        <document>,     
        {      
            writeConcern: <document> 
        }  
    )  
  •   document:文檔數據
  •   writeConcern:可選。拋出的異常級別。

  無需指定query和update對象,直接將新文檔替換掉原來的舊文檔。它通過文檔中的_id欄位確定要修改的欄位。

  如果集合中沒有與傳入文檔的_id欄位值相等的文檔,則會添加新的文檔。

  save() 函數的執行效率要低於update()。

 

查看文檔

  查看集合中的文檔,可以使用find()方法。

  db.collection_name.find() 可以以非結構化的方式顯示集合中的所有文檔。

  db.collection_name.find().pretty() 可以以結構化的方式顯示集合中的所有文檔。

 

刪除文檔

  remove()函數可以用來刪除集合中的文檔。

    db.collection_name.remove(     
        <query>,     
        {       
            justOne: <boolean>,
            writeConcern: <document> 
        } 
    )
  •   query:可選。刪除的文檔的條件。
  •   justOne:可選。如果為true 或 1,則只刪除一個文檔。預設為false。
  •   writeConcern:可選。拋出異常的級別。

  示例:

  註意:如果要刪除集合中的全部文檔,可以使用

db.collection_name.remove({})

 


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

-Advertisement-
Play Games
更多相關文章
  • 日常編程中經常用到++i與i++,知識點雖然很小,但有時候會犯迷糊,在這裡小小的記錄一下。 ++i 即前遞增,顧名思義也就是先自增後傳值; 舉個慄子 此時i的值為6,j的值也為6。 i++即後遞增,顧名思義也就是先傳值後自增 舉個慄子 此時i的值為6,j的值為5。 ...
  • 一丶前言 看過一些描述關於AOP切麵編程的文章,寫的太概念化讓人很難理解,下麵是我自己的理解,希望能幫到新人,如有錯誤歡迎指正。 二丶AOP是什麼,它的應用場景是什麼? AOP也跟IOC,OOP這些思想一樣它只是一種編程思想。Autofac、Spring.Net、Castle這些組件實現了AOP切麵 ...
  • [TOC] 一、進程相關的概念 進程需要瞭解 進程,父進程,進程組,會話和控制終端的相關概念。 1. 進程和父進程:每個進程都有父進程,而所有的進程以init進程為根,形成一個樹狀結構 2. 進程組:每個進程都會屬於一個進程組(process group),每個進程組中可以包含多個進程。進程組會有一 ...
  • SSH服務與tcp wrappers實驗 實驗環境: 一臺linux(ssh client) 一臺linux(ssh server) 實驗步驟: 1.配置IP,測試連通性 2.在客戶端創建用戶yuzly1,登錄創建的用戶,用公鑰生成工具生成公鑰,#註意記得輸入私鑰密語,不設置預設為空 3.查看生成的 ...
  • FTP是有兩種數據連接模式的,主動模式和被動模式。 PORT(主動)方式:客戶端向伺服器的FTP埠(預設是21)發送連接請求,伺服器接受連接,建立一條命令鏈路。當需要傳送數據時,客戶端在命令鏈路上用PORT命令告訴伺服器:“我打開了XXXX埠,你過來連接我”。於是伺服器從20埠向客戶端的XXX ...
  • Laravel 提供了很多 輔助函數,有時候我們也需要創建自己的輔助函數。 這裡介紹了 tinker,一個laravel內置的php互動式控制台,方便調試php代碼 php artisan tinker 我們把所有的『自定義輔助函數』存放於 bootstrap/helpers.php 文件中 首先 ...
  • 背景 現有一個交易系統,每次交易都會更新餘額。出賬扣減餘額,入賬增加餘額。為了保證資金安全,餘額發生扣減時,需要比較現有餘額與扣減金額大小,若扣減金額大於現有餘額,扣減餘額不足,扣減失敗。 餘額表( 省去其他欄位 )結構如下: sql CREATE TABLE ( bigint(20) NOT NU ...
  • 1、編輯一個mysql啟動文件。 在終端裡面輸入: 2、輸入啟動文件內容: 上面xml中的 /usr/local/Cellar/mysql/5.7.20/bin/mysqld_safe 為我的mysql所在目錄。 這個是通過homebrew下載的mysql。 官方下載的路徑為 /usr/local/ ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...