天天看點

mogoose 建立資料庫并增删改查

<code>npm i mongoose -s</code>

<code>schema</code>:表的結構,索引

<code>Model</code>:使用<code>Schema執行個體</code>獲得的具體的表,在這上面對表進行增删改查

<code>document</code>:<code>Model執行個體</code>,相當于表中的每一條資料,<code>Model</code>中查到到的資料也是這種類型

Schema相當于MySql的表結構

通過定義<code>Schema</code>來限制資料的類型,支援以下類型資料

類型

作用

String

定義字元串

Number

定義數字

Date

定義日期

Buffer

定義二進制

Boolean

定義布爾值

Mixed

定義混合類型

ObjectId

定義對象ID

Array

定義數組

Decimal128

定義小數

Map

限制能用對象的方法描述資料類型 是否必須 是否重複 預設值 等,如下定義了一個使用者表結構

注意:如果定義表結構時沒有定義<code>_id</code>,mongoose會自己添加一個該字段,該字段不會重複,類型為<code>ObjectId</code>,通過<code>findById()</code>查詢 在定義表結構時某些字段,如unique會自動建立索引,詳情見下章

如果在定義了結構後需要添加新字段,在執行個體上使用<code>add()</code>方法

通過<code>mongoose.model(name,sechem)</code>來建立表結構構造器,通過傳入資料來執行個體化構造器獲得具體的表

注意:在這一步的時候資料庫已經有了表,表名全是小寫且表明為name加上s,如這裡會建立表<code>users</code>

通過上面的操作就獲得了表的構造函數,接下來就可以向裡面進行增删改查了

有三種方法在表内增加資料:

建立表資料<code>執行個體化model</code>

通過傳入具體的資料來執行個體化表,能獲得一條具體的表資料,類型為<code>Mongoose Documents</code>,向資料庫中查找到的也是這種類型資料

儲存<code>save</code>

獲得具體的表後隻需要調用<code>Model.prototype.save</code>就會把資料存入資料庫中 注意:該方法為異步方法

通過表構造器的靜态方法<code>create</code>自動在表中插入新的資料

該方法可以接收多個插入資料,最後的回調函數參數根據資料量決定

該方法支援兩種調用: 錯誤優先的回調 async await

該方法與<code>create</code>的差別是它接收的第一個參數是資料組成的數組,多條資料隻會插入第一條

不傳入參數會查找該表的所有資料 該方法傳回值始終是數組

第一個參數

指定資料的某個鍵進行查找,鍵也能是正規表達式

限制查找範圍,通過内置的字段限制某個字段的範圍,<code>$where</code>函數參數來指定查詢的限制範圍

還能通過<code>$and $or $not</code>等參數來決定查找的範圍

如果查找的是對象中的屬性用字元串做鍵或者嵌套查找

注意 嵌套查找必須順序一緻

如果查找的是數組中的某項

如果查找的是數組對象中的某項

第二個參數

限制傳回資料含有的資料

第三個參數

可以使用<code>keip limit sort</code>來對查詢結果進行操作

查詢的結果支援鍊式調用,可以使用一些方法再對結果進行操作,相當于把第二個參數寫道外面了

<code>select</code>:設定查詢結果的資料包含哪些鍵 接收列明字元串組成的數組,如果字元串前加上<code>-</code>則是不顯示

<code>limit</code>:限制查找結果的長度

<code>skip</code>:設定查找結果的起式位置

<code>sort</code>:對查找結果排序 接收列名字元串,按照從小到大排序,如果前面加上<code>-</code>則會從大到小排

<code>count</code>:傳回查找結果的數量

<code>lean</code>:将結果傳回為普通的js對象而不是查詢得到的<code>Mongoose Documents</code>類型對象

常用的内置字段:

字段

說明

$or

或關系

$nor

或關系取反

$gt

大于

$gte

大于等于

$lt

小于

$lte

小于等于

$ne

不等于

$in

在多個值範圍内

$nin

不在多個值範圍内

$all

比對數組中多個值

$regex

正則,用于模糊查詢

$size

比對數組大小

$type

比對資料的類型

$maxDistance

範圍查詢,距離(基于LBS)

$mod

取模運算

$near

鄰域查詢,查詢附近的位置(基于LBS)

$exists

字段是否存在

$elemMatch

比對内數組内的元素

$within

範圍查詢(基于LBS)

$box

範圍查詢,矩形範圍(基于LBS)

$center

範圍醒詢,圓形範圍(基于LBS)

$centerSphere

範圍查詢,球形範圍(基于LBS)

$slice

查詢字段集合中的元素(比如從第幾個之後,第N到第M個元素

該方法傳回符合條件的第一條資料

通過每個資料的<code>_id</code>屬性查詢

現在推薦使用<code>Model.deleteOne Model.deleteMany</code>來删除 用法一樣 不傳入參數會删除該表的所有資料 該方法傳回的是删除資料的條數,不會傳回被删除資料

指定要删除資料的某個鍵,鍵也可以使用正規表達式

也可以先查找,然後用資料的<code>remove</code>方法

删除符合條件的第一條資料,并将這條資料傳回

通過<code>_id</code>删除

該方法傳回修改的資訊,不是傳回修改後的資料

先指定查詢的條件,再在第二個參數放入修改的資料,第三個參數為一些設定

第三個參數如下,一般用不上

鍵名

預設值

safe

true

安全模式

upsert

false

是沒有這張表時是不是建立資料

setDefaultsOnInsert

如果upsert選項為true,在建立時插入文檔定義的預設值

strict

以strict模式進行更新

overwrite

禁用update-only模式,允許覆寫記錄

是上面的文法糖,獲得修改後的資料

繼續閱讀