如何使用 Node.js 和 MongoDB 进行 CRUD?

[[405702]]

【】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](https://curl.se/)。)

下载系统适用的MongoDB后,可以将其安装为服务或将其作为可执行文件运行。无论哪种方式,请通过打开命令行并运行`mongo`命令来确保 MongoDB 正在运行。(如果没有作为服务安装,可能需要将该命令添加到路径中。)这使你可以访问系统上运行的 MongoDB 实例。

接下来,确保安装了 Node.js 和 npm。在命令行中,键入`node -v`。如果安装了 Node.js,将获得版本号。如果没有,则需要下载Node.js并安装到机器上。

Curl允许从命令行执行简单的HTTP请求。例如,运行`curl www.google.com`将收到来自 Google 主页的标记。

创建一个 Node.js 项目

在文件夹中创建一个npm init类型的新项目。项目名称可以使用node-mongo-intro。当然,你也可以接受其他缺省值。

添加所需的依赖项。在刚创建的项目目录中,键入`npm install mongodb polka –save`. 这将安装 MongoDB 的 Node.js 驱动程序(允许项目访问 MongoDB)和用于处理 HTTP 请求的Polka HTTP 服务器

编辑 package.json 文件以包含启动脚本,如Listing 1 所示。

Listing 1. A start script 

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node src/index" // <-- add this line
},

接着创建一个 /node-mongo-intro/src/index.js 文件,并将Listing 2 的内容放入其中。

Listing 2. HTTP test in index.js 

const polka = require('polka');

polka()
.get('/create', (req, res) => {
res.end(`works`);
})
.listen(3000, err => {
if (err) throw err;
console.log(`> Running on localhost:3000`);
});

现在用`npm run start`启动服务器。服务器将在端口3000上侦听。你可以使用curl http://localhost:3000/create进行测试。测试后应该会看到“works”的响应(以及一些curl请求信息)。

在 MongoDB 中插入一条记录

现在我们将执行一个简单的插入。这是 CRUD 中的 “C”。将`index.js`文件更新为如Listing 3 所示。

 Listing 3. A simple insert 

const polka = require('polka');
const { MongoClient } = require("mongodb");

polka()
.get('/create', (req, res) => {
const client = new MongoClient("mongodb://localhost:27017");
async function run() {
try {
await client.connect();
const database = client.db("intro");
const collection = database.collection("quotes");

const result = await collection.insertOne({"quote":"Life is what happens to you while you're busy making other plans."});
res.end(JSON.stringify(result));
} catch (e) {
console.log("Error: " + e);
} finally {
await client.close();
}
}
run().catch(console.dir);
})
.listen(3000, err => {
if (err) throw err;
console.log(`> Running on localhost:3000`);
});

Listing 3 中的代码打开到本地系统上 MongoDB 实例的连接,然后指定一个数据库 ( `”intro”`) 和集合 ( `”quotes”`)。集合类似于关系数据库中的表。

接下来,代码插入一个文档(类似于 SQL 记录)并在一个HTTP响应中发送结果。

运行插入

首先,按 Ctrl-C 停止并重新启动节点服务器。然后在命令行运行这个命令: 

npm run startcurl http : //localhost:3000/create

验证插入

如果你掌握 SQL 技术,你会注意到的一件事是,我们在进行这项工作之前没有创建表和模式。我们甚至没有创建我们使用的数据库。因为 MongoDB 为我们完成了这些所需的工作,它可以接受任何类型的结构化键值文档到集合中。

使用mongo打开mongo shell,并输入命令use intro。这将切换到自动创建的intro数据库。现在输入db.quotes.find()命令,将看到该记录被插入。注意MongoDB会在“_id”字段上自动生成一个唯一的ID。你可以通过在文档上自己指定一个来覆盖它。

在MongoDB中检索文档

现在让我们把文件拿出来。添加如 Listing 4所示的.get()映射。这是CRUD中的“R”。

Listing 4. Retrieve a document 

.get('/retrieve', (req, res) => {
const client = new MongoClient("mongodb://localhost:27017");
async function run() {

try {
await client.connect();
const database = client.db("intro");
const collection = database.collection("quotes");

const cursor = collection.find({}, {});

let items = [];
await cursor.forEach(function(doc){
items.push(doc);
});
res.end(JSON.stringify(items));
} catch (error){
console.warn("ERROR: " + error);
if (errCallback) errCallback(error);
} finally {
await client.close();
}
}
run().catch(console.dir);
})

Listing 4 以与Listing 3 相同的方式连接,然后发出一个`find`命令,并带有一个空查询。这意味着它匹配所有文档。接下来,它接收响应并将其编组到一个数组中以发送回客户端。

注意,游标操作和集合是异步的。清单3中的collection.insertOne也是如此。我们使用await关键字来处理这些,而不使用嵌套的回调。

使用curl http://localhost:3000/retrieve测试新端点(在停止并再次启动服务器之后),将看到返回的集合。

MongoDB中更新文档

现在是CRUD中的“U”。Listing 5处理了这一点。

Listing 5. Updating a document 

.get('/update', (req, res) => {
const client = new MongoClient("mongodb://localhost:27017");
async function run() {
try {
await client.connect();
const database = client.db("intro");
const collection = database.collection("quotes");

const updateDoc = {
$set: {
author:
"John Lennon",
},
};

const result = await collection.updateOne({}, updateDoc, {}); // <-- empty filter matches all docs
res.end("Updated: " + result.modifiedCount);
} catch (e) {
errCallback(e);
} finally {
await client.close();
}
}
run().catch(console.dir);
})

Listing 5 再次连接到数据库,然后创建一个更新文档。本文档通过指定一个`$set`包含要更改的字段和值的对象的字段来告诉 MongoDB 要更改什么。在我们的例子中,我们将该`author`字段设置为`”John Lennon”`,即相关引用的引用者。

接下来,Listing 5 使用该`updateOne()`函数来执行更新文档。最后一个空对象参数是过滤器。在这种情况下,我们希望匹配所有文档,因此我们将其留空。

最后,我们发回我们更新的文档数量(一个)。

MongoDB中删除文档

CRUD的最后一个字母是“D”,表示删除。

删除操作的映射如Listing 6所示。

Listing 6. Deleting a document 

.get('/delete', (req, res) => {
const client = new MongoClient("mongodb://localhost:27017");
async function run() {
try {
await client.connect();
const database = client.db("intro");
const collection = database.collection("quotes");
const query = { };
const result = await collection.deleteOne(query);
if (result.deletedCount === 1) {
res.end("Successfully deleted one document.");
} else {
res.end("Deleted 0 documents.");
}
} finally {
await client.close();
}
}

这里我们再次使用空查询来匹配`”quotes”`集合中的所有文档。async`collection.deleteOne()`函数返回一个结果,告诉我们有多少文档受到影响。

重新启动服务器 (Ctrl-C) 并发出新的 curl 命令: 

curl http://localhost:3000/delete

您可以使用curl http://localhost:3000/retrieve来验证文档是否已被删除。

【译稿,合作站点转载请注明原文译者和出处为.com】

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/229821.html<

(0)
管理的头像管理
上一篇2025-04-18 22:59
下一篇 2025-04-18 23:00

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注