<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模式,允許覆寫記錄
是上面的文法糖,獲得修改後的資料