零基礎學習MongoDB(四)—— 文檔CRUD操做

這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰css

1、插入數據

1.1 插入單條文檔

1.1.1 insert 函數

語法格式db.collectionName.insert(文檔)html

  • db是當前操做的數據庫
  • collectionName是操做的集合,沒有會自動建立
  • 插入的文檔若是沒有_id屬性,會自動建立

例如在user集合下插入單個文檔html5

db.user.insert({name:"ljc",love:["soccer","music"]})
複製代碼

在可視化工具中實操的結果,在命令行中結果一致!node

image-20210711164118797

1.1.2 insertOne 函數

在 MongoDB3.2 以後的版本中,提供了 insertOne()函數用於插入文檔,同時廢棄了save函數,所以就不學習它了,它的使用方法和insert相同webpack

語法格式:db.COLLECTION_NAME.insertOne(document)web

例如在user集合下插入單個文檔正則表達式

db.user.insertOne({name:"ddd",love:["play game","running"]})
複製代碼

在可視化工具中實操的結果,在命令行中結果一致!shell

image-20210711165046920

1.2 插入多條文檔

向集合中批量插入多個文檔時,須要使用數組來存放文檔數據庫

1.2.1 insert 函數

語法格式:db.COLLECTION_NAME.insert([{},{},{}…])數組

例如採用insertuser中批量插入人員信息

db.user.insert([{name:"張三",age:"18"},{name:"李四",age:"19"}])
複製代碼

image-20210711170351546

1.2.2 insertMany 函數

語法格式:db.COLLECTION_NAME.insertMany([{},{},{}…])

例如採用insertManyuser中批量插入人員信息

db.user.insertMany([{name:"王五",age:"28"},{name:"唐六",age:"29"}])
複製代碼

image-20210711170710492

1.3 tips

db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany(document)
db.COLLECTION_NAME.replaceOne(document)
複製代碼

參數說明

  1. document:要寫入的文檔
  2. writeConcern:寫入策略,默認爲 1,即要求確認寫操做,0 是不要求
  3. ordered:指定是否按順序寫入,默認 true,按順序寫入

2、更新文檔

MongoDB經過update函數或者save函數來更新集合中的文檔。

2.1 update 函數

update() 函數用於更新已存在的文檔。

語法格式爲:

db.COLLECTION_NAME.update(query,update,options)
複製代碼
  1. query : update的查詢條件,根據這個來選擇須要更新的數據
  2. updateupdate的對象和一些更新的操做符
  3. upsert:可選參數,意思是若是不存在須要更新的數據,是否要做爲新數據插入集合中,參數值爲true或者false,默認值是false,不插入
  4. multi:可選參數,是否批量更新,意思是當查詢到多個符合查詢條件的數據時,是否要所有更新,仍是隻更新第一條,默認是false
  5. writeConcern:可選參數,拋出異常的級別

實操

首先咱們在user集合下插入一些數據

db.user.insertMany([{title:"html",page:300},{title:"css",page:300},{title:"js",page:200},{title:"ts",page:250},{title:"webpack",page:220}])
複製代碼

插入成功

image-20210712010401820

接下來咱們來對集合中的數據進行更新

第一個需求:將htmlpage改爲500

db.user.update({title:"html"},{title:"html",page:500})
複製代碼

image-20210712011107780

特別注意:更新文檔是更新整個文檔的操做,即便只須要修改一個值,其餘屬性同樣須要寫下來,否則其餘屬性將被刪除

第二個需求:將全部page爲200的改成400

db.user.update({page:200},{$set:{page:400}},{multi:true})
複製代碼

操做結果

image-20210712011839152

在上面採用了$set操做符,用來只更新數據中的某個屬性

2.2 updateOne 和updateMany

db.collection.updateOne() 向指定集合更新單個文檔

db.collection.updateMany() 向指定集合更新多個文檔

2.3 更新操做符

2.3.1 $set 操做符

用來指定一個鍵並更新鍵值,若鍵不存在則建立。也就是咱們能夠經過這個操做符,指定咱們須要修改的屬性,而不用更新整個文檔

語法格式db.COLLECTION_NAME.update({查詢條件},{更新操做符:{更新內容}})

html改爲html5

db.user.update({title:"html"},{$set:{title:"html5"}});
複製代碼

這樣咱們就將查找到的文檔中的某個數據修改,而不刪除其餘數據

若是數據未被找到,則新建新增數據

2.3.2 $inc 操做符

對文檔中知足要求的數字型的值進行增減操做,正則增,負則減

db.user.updateOne({title:"js"},{$inc:{page:-20}})
複製代碼

titlejs的數據的page屬性進行減20的操做

image-20210712015531485

2.3.3 $unset 操做符

用來刪除鍵,讓鍵的值爲空。在編寫命令時$unset裏更改數據取值任意,不管給定什麼值都表示刪除。

刪除htmlpage

db.user.update({title:"html"},{$unset:{page:"aaaa"}});
複製代碼

image-20210712020103682

2.3.4 $push 操做符

這裏插入一個點:若是須要更改所有數據,咱們的query屬性填{}便可,也就是查找所有

向文檔的某個數組類型的鍵添加一個數組元素,不過濾重複的數據。鍵不存在,則建立數組類型的鍵

給全部的文檔添加一個auth字段,值爲ljc

db.user.update({},{$push:{auth:"ljc"}},{multi:true});
複製代碼

從結果來看是添加成功,須要注意的是,數組,數組,數組!

image-20210712021907313

2.3.5 $pop 操做符

刪除數據中數組元素,取值只能是1或-1,1表示尾部刪除,-1表示頭部刪除

首先咱們先push一下,讓數組豐富一點,給html添加多一個auth

db.user.update({title:"html"},{$push:{auth:"htmlauth"}});
複製代碼

image-20210712022355332

接下來演示pop操做,刪除htmlauth數組的第一個值

db.user.update({title:"html"},{$pop:{auth:-1}})
複製代碼

image-20210712022814969

2.3.6 pull 操做符

從數組中刪除知足條件的元素,只要知足條件都刪除

刪除auth數組中元素內容爲ljc

db.user.update({title:"js"},{$pull:{auth:"ljc"}})
複製代碼

image-20210712023616033

2.3.7 pullAll 操做符

能夠同時刪除數組中的多個值

tsauthljc以及ccc刪除掉

db.user.update({title:"ts"},{$pullAll:{auth:["ljc","ccc"]});
複製代碼

2.3.8 rename 操做符

對鍵進行從新命名。任何類型的鍵都能重命名

將全部title的屬性名改爲name

db.user.update({},{$rename:{title:"name"}},{multi:true})
複製代碼

成功將改爲了name

image-20210712024301297

3、刪除文檔

3.1 remove 函數

語法格式:

db.user.remove(<query>,{justOne:<boolean>})
複製代碼

參數說明:

  • query:可選刪除的文檔條件
  • justOne:刪除多個或者一個文檔。true只刪除一個,false刪除全部匹配的數據

刪除name值爲html的文檔

db.user.remove({name:"html"},{justOne:true})
複製代碼

成功刪除

image-20210712025651467

刪除全部數據

db.user.remove({})
複製代碼

注意:remove豐富不會真正的釋放空間,須要執行db.repairDatabase()來回收磁盤空間

3.2 deleteOne 函數

該方法只刪除知足條件的第一條文檔,相對於remove簡潔了不少

刪除js

db.user.deleteOne({name:"js"})
複製代碼

3.3 deleteMany 函數

刪除知足條件的全部文檔

刪除全部page200的文檔

db.user.deleteMany({page:200})
複製代碼

4、查詢文檔

查詢文檔採用find函數

語法格式

db.collection.find(query, projection)
複製代碼
  • query :可選,指定查詢的條件
  • projection :可選,使用投影操做符指定返回的鍵

**注意:**能夠經過db.collection.find().pretty()方法以易讀的方式來讀取數據

一樣的可使用findOne方法,返回一個文檔

4.1 查詢全部

查詢全部文檔

db.user.find({})
複製代碼

根據名字去重

db.user.distinct("name")
複製代碼

注意:MongoDB中使用方法通常都要$號開頭

4.2 條件操做符

採用條件操做符用於比較兩個表達式,再從集合中獲取數據

語法格式:find({鍵:{操做符:條件}})

findOne也能夠噢~

4.2.1 $eq

等於操做符

查詢全部page爲300的文檔對象

db.user.find({page:{$eq:300}})
複製代碼

image-20210712125557941

4.2.2 $lt

小於操做符

查詢page小於300的文檔對象

db.user.find({page:{$lt:300}})
複製代碼

image-20210712125645192

4.2.3 $lte

小於或等於操做符

查詢page小於等於300的文檔對象

db.user.find({page:{$lte:300}})
複製代碼

image-20210712125846314

4.2.4 $gt

大於操做符

查詢page大於250的文檔對象

db.user.find({page:{$gt:250}})
複製代碼

image-20210712125956480

4.2.5 $gte

大於等於操做符

查詢page大於等於300的文檔對象

db.user.find({page:{$gte:300}})
複製代碼

image-20210712130154607

4.2.6 $ne

不等於操做符

查詢page不等於300的文檔對象

db.user.find({page:{$ne:300}})
複製代碼

image-20210712130326669

4.2.7 $in

多條件查詢,只要知足in中其中一個條件,就能被查詢出來

查詢page220300的文檔對象

db.user.find({page:{$in:[300,220]}})
複製代碼

image-20210712130832662

注意:$in後面的值是一個數組類型!!

4.2.8 $nin

in相反,除了in中的都查詢出來

查詢page不爲220300的文檔對象

db.user.find({page:{$nin:[300,220]}})
複製代碼

image-20210712131038761

4.2.9 $and

查找同時知足多個條件的文檔對象

語法格式:

db.col.find({$and:[{條件一},{,條件二},…]})
複製代碼

查詢page300而且name值爲node的文檔

db.user.find({$and:[{name:"node"},{page:300}]})
複製代碼

image-20210712132156567

當同時指定多個查詢條件時,默認是並列關係,所以咱們能夠直接寫

db.user.find({name:"node"},{page:300})
複製代碼

4.2.10 $or

查詢至少知足多個條件中其中一個的文檔對象

查詢page300或者name值爲node的文檔

db.user.find({$or:[{name:"node"},{page:300}]})
複製代碼

image-20210712132617726

4.2.11 $type 操做符

根據值類型來查詢

查詢page爲的值類型爲number的值

db.user.find({page:{$type:"number"}})
複製代碼

image-20210712140953241

數據類型以下,來自菜鳥教程

image-20210712141211056

可使用類型對應的數字來指定

db.col.find({"title" : {$type : 2}})
等價於
db.col.find({"title" : {$type : 'string'}})
複製代碼

4.3 正則查詢

利用正則表達式來查詢特定格式的文檔

查詢names結尾,不區分大小寫的文檔

db.user.find({name:/s$/i})
複製代碼

image-20210712141924128

4.4 投影查詢

只選擇文檔中的部分數據,而不是整個文檔所有數據

find()方法中默認會顯示一個文檔中的所有字段,要限制這點只須要設置字段列表值01

只顯示name值,同時不顯示_id

db.user.find({},{_id:0,name:1})
複製代碼

image-20210712144437327

顯示namepage

db.user.find({},{page:1,name:1})
複製代碼

image-20210712144613987

注意:_id字段是默認存在的!!

不顯示namepage

db.user.find({},{page:0,name:0})
複製代碼

image-20210712144750888

特別注意:只有在設置_id:0,的狀況下才容許屬性值不一樣,也就是對於除_id之外的數據,不容許同時一個設置1,一個設置0

例如:

db.user.find({},{_id:0,page:1,name:0})
複製代碼

報錯

image-20210712145242255

4.5 數組查詢

在咱們的數據集中,經常會有數組的存在,所以,查詢數組也是很重要的

  1. 查詢auth數組中有ljc的文檔
db.user.find({auth:"ljc"})
複製代碼

image-20210712151255562

  1. 查詢auth數組中既有ljc又有cssauth的文檔
db.user.find({auth:{$all:["ljc","cssauth"]}})
複製代碼

image-20210712151501836

  1. 查詢auth數組中第二個元素爲ljc的文檔

經過auth.1來指定數組的第二個元素

db.user.find({"auth.1":"ljc"})
複製代碼

image-20210712151719623

  1. 查詢auth數組中第一個到第二個元素(其餘字段保留)
db.user.find({},{auth:{$slice:[0,2]}})
複製代碼

image-20210712155412805

  1. 查詢auth數組中最後一個元素
db.user.find({},{auth:{$slice:-1}})
複製代碼

image-20210712160203791

4.6 排序

採用sort方法,根據數據進行排序,使用1-1來指定排序方式爲升序仍是降序

根據page有小到大進行排序

db.user.find().sort({page:1})
複製代碼

image-20210712161655804

4.7 分頁

使用limit()方法來讀取指定數量的數據外,再使用skip()方法來跳過指定數量的數據

語法格式

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
複製代碼

實例

db.user.find.limit(2).skip(0) #前兩個
db.user.find.limit(2).skip(2) #3,4
複製代碼

4.8 統計

count用來計算符合條件的值有多少個

統計page中小於270的有多少個

db.user.count({"page":{$lt:270}})
複製代碼

image-20210712163343467

相關文章
相關標籤/搜索