Node の MongoDB Driver

序
在之前的《Node の MongoDB 安装》 一文当中,主要说的是如何安装MongoDB
和其可视化界面Compass
。
现在来说说 node 怎么连接使用MongoDB
,对于 node 连接,可以使用两种方式,都是下载库:
mongodb: MongoDB 有一个基础库
mongodb
(Node.js MongoDB Driver)Mongoose: 现在主流使用的库,在代码量上更优,只需增删改查推荐
mongodb
这是基础库,不过基本的功能都是有的,如果需求不是太多使用这个即可。
下载
安装命令:yarn add mongodb
可参考:https://www.mongodb.org.cn/drivers/5.html
然后创建 mongo 文件夹和 index.js,里面写mongodb
库的使用方法。
nodemon 运行的主程序是 main.js

连接
首先测试 mongodb 数据库是否存在,能否进行相连。
从mongodb
库中导入MongoClient
客户端模块,该模块可以用来连接数据库
测试方法如下:(这里的 baseUrl 是依据之前数据库的地址,也可以在可视化界面中查看要连接的数据库 url)

运行:

但其实此时数据库mongodbTest
没有创建出来,在可视化界面compass
或者 cmd 中都没有

然后,我在网上找了半天,发现这只是连接到了 27017 那里,没有将不存在的数据库创建出来。(这里菜鸟教程上的代码应该是不对的)

所以这里自己先手动创建一个数据库吧,可以在可视化界面中创建,简单一点,然后可以在数据库中再创建一个集合。


慢着,接下来我去 mongodb 官网进行了一波搜索,终于成功用代码创建上了数据库了,并且菜鸟上的方法确实不行了。
PS: 这里发了一波沸点,还有掘友给了比较完整的回复,哈哈哈

在之前的测试连接方法中可以稍作修改,使用 async 和 await 来进行,这样让代码看上去更舒服一些。
mongodb 官方 API:https://mongodb.github.io/node-mongodb-native/4.5/
这里用到了MongoClient.db
方法,此方法会使用或者建立一个数据库,但是,如果没有给这个数据库创建集合,那么此数据库也不会生成出来的。
获取集合列表
既然成功创建了数据库,那么尝试获取该数据库下的所有集合信息collections
,可以使用collectionName
将这些集合的名称打印出来
集合列表名称:

上面对数据库和集合列表简单使用完了之后,可以对单个集合进行操作。
PS: 对于数据库 db 的操作方法可以参考具体的 API 文档,里面的方法也比较全面

创建集合并插入数据
这里使用 db 中的 createCollection 方法,可以用来创建新的集合
createCollection 方法参数:

测试代码:
创建完一个空集合后,就该给此集合插入数据了
在 mongodb 中,集合中大部分都是文档,或者前端可以看成键值对的 JSON 数据
实例:定义一个文档,并使用insertOne
插入到目标集合当中:
insertOne 插入如果成功,将会返回当前文档在集合中的 id


关于插入文档到集合中的方法有以下 3 种:(这三种方法的返回值都是 Promise,可以使用 async 和 await 来解决回调)
insert: 将单个文档或文档数组插入 MongoDB。如果传入的文档不包含\u id 字段,驱动程序将向缺少该字段的每个文档中添加一个,从而改变文档
insertMany: 将文档数组插入 MongoDB。如果传入的文档不包含\u id 字段,驱动程序将向缺少该字段的每个文档中添加一个,从而改变文档
insertOne: 将单个文档插入 MongoDB。如果传入的文档不包含\u id 字段,驱动程序将向缺少该字段的每个文档中添加一个,从而改变文档
接下来试试插入文档数组:


读取集合中的数据
在上面已经将文档内容插入到数据库的集合当中了,那么如何将数据从数据库中读取出来呢?
MongoDB
库提供了find
方法

示例: 这里需要用 toArray 转换一下,或者也可以使用回调方法查看

如果检索数据时,需要过滤掉一些无用的数据,那么可以在find
中写入参数进行配置。
这里使用projection
限制返回的字段,将不需要读取的属性设置为 0,或者将需要读取的内容设置为 1。
注意,这里最好不要同时设置出 0 和 1,只需要设置读取或者不读取即可。否则可能会出现报错:MongoServerError: Cannot do inclusion on field name in exclusion projection
(如果在同一对象中同时指定 0 和 1 值,则会出现错误,除非其中一个字段是\u id 字段)
以下示例就是将_id
和age
不进行读取:
结果:

在上面的示例中,会发现find
方法中第一个参数是{}
,因为这是查询对象,用于限制搜索的。可以使用来筛选。
query 示例:
这样返回的结果只有张三的信息了:

删除集合信息
现在尝试去将之前存入的文档从集合中删除
同样也有 delete 删除方法


更新集合
上面已经写好了增删查,现在 curd 还剩下更新

示例:
此时,数据库中王五的爱好就从打张三变成了打李四

以上就是 mongodb 库的基本使用,没想到会写这么多。
mongoose 留到下次了...
版权声明: 本文为 InfoQ 作者【空城机】的原创文章。
原文链接:【http://xie.infoq.cn/article/ded7ddcc9314e1a67250c1462】。文章转载请联系作者。
评论