<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模式,允许覆盖记录
是上面的语法糖,获得修改后的数据