mongoose的基本操作
前言
mongoose与mongodb的关系
mongodb
实际上是一个跨平台的nosql
型数据库软件,而mongoose
是一个基于mongodb
的官方js
驱动实现的js
库,即专门用于在node.js
环境下与mongodb
数据库进行连接操作。
为什么使用mongoose
事实上mongodb
官方已经实现了基于node.js
的驱动库,npm
包名就叫mongodb
,专门用来与mongodb
数据库进行连接操作的,所以为何还要使用第三方实现的mongoose
库。这是实际上还是取决于每个人的习惯和理念,由于mongodb
在设计上就对于collection
(对应于sql
数据库中的数据表)的结构限制很少,可以认为其存取数据很灵活,也可以认为其存取数据比较松散,这完全是个人口味问题。
而我个人比较习惯对于同一集合(collection
)中数据的格式要保持一致性,即每条数据的结构和类型是一致的,不然总觉得不同结构和类型的数据存放于同一集合中就太混乱了(也许是还无法适应mongodb
的设计模式)。
而mongoose
就加入了Schema
这一设计,使得集合中的数据保持结构和类型的一致性成为可能,方便数据管理。
基本操作
数据库连接
1 | const mongoose = require('mongoose') |
注:mongodb
数据库的默认端口为27017
;
连接集合与Model
Schema
可以看做是Model
与collection
之间的中介(相当于proxy
),因为实际上不同的Schema
可以连接到同一个collection
,也就是即便是使用mongoose
后仍然会出现同一个集合内存在不同数据结构的数据;但是由于有Schema
这层中介的存在,使得同一Schema
内的数据结构是一致的,就不需要我们自己手动地去集合内约束和判断数据结构了(即把数据结构从集合中抽离出来,集合本身不再有固定的数据结构)。
而Model
可以看做某个collecton
中具有某个Schema
的一部分数据,即一个Model
需要通过某个Schema
来对某个collection
进行数据操作。
1 | const mongoose = require('mongoose') |
连接集合的方式有两种,一种是mongoose
约定的形式;另一种是给schema
指定一个具体的collection
,使用此schema
的model
都自动连接到这个collection
;
方法一
1 | // 方法一:指定一个具体的collection |
方法二
1 | // 方法二:根据Model的名称自动查找 |
CRUD
插入数据
一条数据即一条document
,而每条document
都是某个model
的实例;所以插入一条数据到某个集合
就要先得到该集合
的某个Model
,然后new
一个该Model
的实例,填入数据后可以使用save
方法进行插入;
1 | let schema = Schema(testSchema, {collection: 'info'}) |
查询数据
查询条件应该是数据库操作中用的最多的操作,写法自然也是丰富多样,我觉得有必要单独去专门写一个mongoose
条件语句(mongoose
实际上使用的条件语句格式是mongodb
官方规定的语句)的文章,目前还没有使用那么多的语法(主要是还没有遇到那么多的应用场景……)。
mongoose
的查询API
有:
- Model.find()
- Model.findById()
- Model.findByIdAndDelete()
- Model.findByIdAndRemove()
- Model.findByIdAndUpdate()
- Model.findOne()
- Model.findOneAndDelete()
- Model.findOneAndRemove()
- Model.findOneAndUpdate()
经常使用的方法主要是find()
和findOne()
这两个,前者可以返回多条满足条件的数据,而后者只返回第一条匹配条件的数据;
1 | let schema = Schema(testSchema, {collection: 'info'}) |
如上,findOne()
方法的第一个参数为查询条件,第二个参数为回调函数(回调函数第一个参数为Error
对象,当不为undefined
时则代表查询发生错误,第二个参数为匹配条件的数据);
1 | let schema = Schema(testSchema, {collection: 'info'}) |
而find()
方法的用法几乎与findOne()
的一致,只是回调函数的第二个参数是一个数组,包含所有满足查询条件的数据;
更新数据
更新的本质就是先查询后修改,所以也需要用到查询语句;但是除此外还需要用到修改语句,又是有许多内容可讲;
mongoose
的更新数据API
有:
- Model.replaceOne()
- Model.updateMany()
- Model.updateOne()
删除数据
删除操作也是先进行查询在删除的,所以也要用到查询语句;
mongoose
的删除数据API
有:
- Model.deleteMany()
- Model.deleteOne()
注意事项
当对某条数据的一部分(字段)的内容进行增删操作时,实际上还是属于更新数据的范畴,注意不要混淆!
后话
实际上还有很多需要整理的,但是目前使用的场景并不多,使用的语法的也比较零散,还是需要时间和项目的使用慢慢积累才行。