Node.js和MongoDB带来了非常快速和灵活的开发体验。只要看看我们如何快速而轻松地用Node在MongoDB中创建、读取、更新和删除一个文档。
软件架构师,InfoWorld |

复制代码
Thinkstock
MongoDB是最早的NoSQL数据存储之一,也是当今最流行的NoSQL数据存储。Node.js的JavaScript运行时继续在后端开发中占据主导地位。它们共同构成了一个高度灵活和动态的技术栈。
正如你将看到的,Node.js和MongoDB允许你快速实现基本的应用程序功能,如CRUD(创建、读取、更新和删除)操作。在本文中,我们将使用最新的Node.js MongoDB驱动(3.6以上版本),来看看CRUD的基本原理。
Node.js和MongoDB设置
你需要在你的系统上安装Node.js和MongoDB,以及一个有curl
命令的命令行。(如果你使用的是2018年以来的Linux、MacOS或Windows 10版本,你很可能有curl。)
你可以在这里为你的操作系统下载MongoDB。一旦下载,你可以把它安装为一个服务或作为一个可执行文件运行。无论哪种方式,通过打开一个命令行并运行mongo
命令,确保MongoDB正在运行。如果你没有以服务方式安装,你可能需要将该命令添加到你的路径中)。这使你能够访问在你系统上运行的MongoDB实例。
接下来,确保你安装了Node.js和npm。在命令行中,输入node -v
。如果Node.js已经安装,你会得到版本号。如果没有,去Node.js的下载页面,在你的机器上安装Node。
Curl允许你从命令行中执行简单的HTTP请求。例如,如果你运行curl www.google.com
,你会收到来自Google主页的标记。
创建一个Node.js项目
现在去一个方便的文件夹,在那里你将创建一个新的项目。输入npm init
。对于项目名称,使用node-mongo-intro。你可以接受其他的默认值。
现在添加你需要的依赖项。在你刚刚创建的项目目录中,输入npm install mongodb polka --save
。这将安装MongoDB的Node.js驱动(允许你的项目访问MongoDB)和Polka HTTP服务器,你将用它来处理HTTP请求。
编辑package.json文件,包括一个启动脚本,如清单1所示。
清单1.一个启动脚本
"scripts": {
复制代码
现在创建一个/node-mongo-intro/src/index.js文件,并将清单2的内容放入其中。
清单2.index.js中的HTTP测试
const polka = require('polka');
复制代码
现在用npm run start
启动服务器。该服务器将监听3000端口。你可以用curl http://localhost:3000/create
来测试它。如果你这样做,你应该看到 “works “的响应(连同一些curl请求信息)。
在MongoDB中插入一条记录
现在我们要执行一个简单的插入。这就是CRUD中的C。更新index.js
文件,使其看起来像清单3。
清单3.一个简单的插入
const polka = require('polka');
复制代码
清单3中的代码在你的本地系统上打开一个与MongoDB实例的连接,然后指定一个数据库("intro"
)和集合("quotes"
)。一个集合类似于关系数据库中的一个表。
接下来,代码会插入一个文档(类似于SQL记录),并将结果以HTTP响应的方式发送回来。
运行插入程序
首先,按Ctrl-C键,停止并重启节点服务器。然后在命令行上运行这个命令。
npm run startcurl http://localhost:3000/create
复制代码
验证插入
如果你有SQL背景,你会注意到一件事,那就是我们在做这项工作之前,并没有创建一个表和模式。我们甚至没有创建我们使用的数据库。MongoDB为我们做了这一切,而且它可以接受任何种类的结构化键值文件进入集合。
用mongo
,打开mongo shell,然后输入命令use intro
。这将切换到自动创建的介绍数据库。现在输入db.quotes.find()
命令,你会看到记录被插入了。注意,MongoDB在"_id"
字段上自动生成了一个唯一的ID。你可以通过自己在文档上指定一个ID来覆盖它。
在MongoDB中检索一个文档
现在让我们把文档拿回来。添加清单4中看到的.get()
映射。这就是CRUD中的R。
清单4.检索一个文档
.get('/retrieve', (req, res) => {
复制代码
清单4以与清单3相同的方式进行连接,然后发出一个find
命令,其中有一个空查询。这意味着它匹配所有的文档。接下来,它获取响应,并将其编入一个数组,然后发回给客户端。
注意游标操作是异步的,就像清单3中的collection.insertOne
操作一样。我们使用await
关键字来处理这些操作,没有嵌套的回调。
用curl http://localhost:3000/retrieve
测试新的端点(在停止和再次启动服务器之后),你会看到集合被返回。
在MongoDB中更新一个文档
现在是CRUD中的U。这在清单5中进行了处理。
清单 5.更新一个文档
.get('/update', (req, res) => {
复制代码
清单5再次连接到数据库,然后创建一个更新文档。这个文档通过指定一个$set
字段来告诉MongoDB要改变什么,该字段包含一个带有要改变的字段和值的对象。在我们的例子中,我们将author
字段设置为"John Lennon"
,即有关报价的报价人。
接下来,清单5使用updateOne()
函数来执行更新文件。最后一个空对象的参数是过滤器。在这种情况下,我们想在所有文件上进行匹配,所以我们把它留空。
最后,我们送回我们更新的文档的数量(一个)。
在MongoDB中删除一个文档
CRUD缩写中的最后一个字母是D,代表删除。
删除操作的映射在清单6中显示。
清单 6.删除一个文档
.get('/delete', (req, res) => {
复制代码
这里我们再次使用一个空查询来匹配"quotes"
集合中的所有文档。Asynccollection.deleteOne()
函数返回一个结果,告诉我们有多少文档受到影响。
重新启动服务器(Ctrl-C)并发出一个新的curl命令。
curl http://localhost:3000/delete
复制代码
You can verify the doucument has been deleted with `curl http://localhost:3000/retrieve`.
Dynamic CRUD duo
And there you have it, the full lifecycle for a document in the MongoDB data store: create, read, update, and delete.
The Node.js and MongoDB combo (with some help from Polka) makes for a very fast and flexible development experience. Learn more about Node.js [here](https://www.infoworld.com/article/3210589/what-is-nodejs-javascript-runtime-explained.html) and more about MongoDB and other NoSQL data stores [here](https://www.infoworld.com/category/nosql/).
`
Related:
Matthew Tyson is a founder of Dark Horse Group, Inc. He believes in people-first technology. When not playing guitar, Matt explores the backcountry and the philosophical hinterlands. He has written for JavaWorld since 2007.
Follow
Copyright © 2021 IDG Communications, Inc.
- Stay up to date with InfoWorld’s newsletters for software developers, analysts, database programmers, and data scientists.
- Get expert insights from our member-only Insider articles.
`