天天看点

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模式,允许覆盖记录

是上面的语法糖,获得修改后的数据

继续阅读