MongoDB是一种现代的通用文档型数据库平台,它已被广泛应用于Node.js在内的主流技术栈,如MEAN栈(MongoDB、Express.js、AngularJS和Node.js)和MERN栈(MongoDB、Express.js、React.js和Node.js)。
npm是Node.js的包管理器,它是连接MongoDB Node.js驱动程序的桥梁,使开发者更容易在Node.js应用程序内部与MongoDB进行交互。
本博客文章将指导您使用Node.js驱动程序连接到MongoDB数据库的步骤,该驱动程序以npm包的形式提供。要跟上,您需要以下工具
Node.js和npm
Node.js是一个用于构建快速和可扩展网络应用的JavaScript运行时,它自带npm。您可以从Node.js网站下载您平台的安装程序。
MongoDB Node.js驱动程序
要连接您的应用程序与数据库,您需要一个软件组件,也称为驱动程序。MongoDB Node.js驱动程序支持数据库连接、身份验证、CRUD操作和其他功能。
MongoDB Atlas
您可以使用MongoDB Atlas(一个全面管理的云数据库服务)在本地或云中创建数据库。
首先,确保您有兼容的Node.js版本。您可以在终端运行以下命令来检查
node --version
如果出现错误,请访问Node.js 文档 并安装正确的Node版本。
Node.js安装程序还会安装npm,Node包管理器。要确保您已安装npm,请在终端执行以下命令
npm --version
如果您遇到此命令或其他npm命令的问题,请参阅npm文档 以帮助解决这些问题。
您可以在其GitHub仓库中探索此项目的最终代码。或者,您可以跟随步骤从头开始构建项目。
首先,创建一个名为“node-mongoDB
”的项目目录。打开您的终端并执行以下命令
mkdir node-mongoDB && cd node-mongoDB
一旦进入目录,通过运行以下命令创建一个“package.json
”文件
npm init -y
“y
”标志会生成一个使用默认值的npm包。
在这个项目中,我们将使用ECMAScript模块,这是包装JavaScript代码的标准化方式。为了启用ECMAScript模块,在“package.json”文件中添加一个新字段
"type": "module"
这将指示Node.js将您的JavaScript代码视为ECMAScript模块,而不是默认的CommonJS模块。启用ECMAScript模块还将允许我们使用顶级await。简而言之,这意味着我们可以在async函数之外使用await关键字。
接下来,通过运行以下命令安装MongoDB驱动及其依赖项
npm install mongodb
“npm install
”命令的执行将花费几秒钟到一分钟,具体取决于您的网络连接。该命令将从npm公共注册表下载“mongodb
”包到您的项目的“node_modules
”目录。
对于本教程,您需要一个MongoDB数据库实例。如果您没有,您可以在MongoDB Atlas中创建一个免费集群。按照以下步骤创建并连接到集群
请确保保存连接字符串和数据库用户的凭据,以便连接到数据库。
现在我们已经有一个集群,我们可以连接到它。将连接字符串和凭证与代码分开是一个好习惯。您可以通过创建一个不包含版本历史记录的配置文件来实现。在项目的根目录中创建一个“.env
”文件,并将您的集群连接字符串作为变量添加
DB_URI=mongodb+srv://<username>:<password>@<clustername>.mongodb.net/
为了将配置加载到我们的应用程序中,我们将使用dotenv
包。在终端中执行以下npm命令来安装它
npm install dotenv
接下来,在您的项目中创建一个新的目录“src
”,并在其中创建一个新的“index.js
”文件。您可以在终端中执行以下命令来完成此操作
mkdir src && touch src/index.js
在您喜欢的代码编辑器中打开项目,然后开始编辑“src/index.js
”文件。
在文件顶部,导入dotenv
包。由于我们正在使用ECMAScript模块,我们应该使用import/export
语法而不是CommonJS的require()
函数。
import { config } from 'dotenv';
然后,我们需要调用config()
函数将“.env
”文件中的变量加载到process.env
中。一旦我们完成,我们可以记录连接URI以确认配置已正确加载。
import { config } from 'dotenv';
config();
console.log(process.env.DB_URI);
在终端中执行脚本
node src/index.js
您应该看到连接字符串。现在我们已经加载了URI,我们可以使用MongoDB Node.js驱动程序连接到我们的集群并查询数据。让我们将逻辑分离到新的“src/studentsCrud.js
”文件中。创建该文件并在编辑器中打开它。
首先,从 mongodb npm
包中导入 MongoClient
对象。MongoClient
是用于建立数据库连接的对象。
import { MongoClient } from 'mongodb';
之后,创建一个名为 connectToCluster
的新异步函数,实现如下
export async function connectToCluster(uri) {
let mongoClient;
try {
mongoClient = new MongoClient(uri);
console.log('Connecting to MongoDB Atlas cluster...');
await mongoClient.connect();
console.log('Successfully connected to MongoDB Atlas!');
return mongoClient;
} catch (error) {
console.error('Connection to MongoDB Atlas failed!', error);
process.exit();
}
}
该函数接受一个参数 —— uri
—— 并实例化一个 MongoClient
。然后,通过调用异步的 connect()
方法进行连接。我们使用 await
关键字等待连接建立后再执行后续语句。整个实现都被 try/catch
语句包围。如果发生错误,我们在标准输出中记录一条消息,并使用 process.exit()
终止执行。
在接下来的部分中,我们将实现针对数据库中“students
”集合的简单 CRUD(创建、读取、更新、删除)操作。让我们先在“src/studentsCrud.js
”文件中创建一个名为 executeStudentCrudOperations()
的新函数。从该函数开始,我们将使用提取的 URI 和 connectToCluster()
函数连接到数据库。我们还将使用 try/finally
语句包裹连接调用。在 finally
块中,我们确保在脚本执行完毕或发生错误时关闭连接。
export async function executeStudentCrudOperations() {
const uri = process.env.DB_URI;
let mongoClient;
try {
mongoClient = await connectToCluster(uri);
} finally {
await mongoClient.close();
}
}
让我们使用该函数连接到我们的集群!将其导入“src/index.js
”文件并调用它。确保使用 await
关键字。如果不使用它,脚本将在函数执行完毕之前终止。你也可以删除记录连接字符串的那一行。
“src/index.js
”文件的最终版本应如下所示
import { config } from 'dotenv';
import { executeStudentCrudOperations } from './studentsCrud.js';
config();
await executeStudentCrudOperations();
在终端中执行脚本
node src/index.js
你应该看到以下消息被记录
Connecting to MongoDB Atlas cluster...
Successfully connected to MongoDB Atlas!
做得好!在接下来的部分中,我们将实现针对数据库中新的“students
”集合的简单 CRUD(创建、读取、更新、删除)操作。
现在,您可以通过使用 db()
方法选择一个数据库。如果数据库尚不存在,它将被创建。
我们的示例将创建一个名为“school
”的数据库,该数据库将有一个名为“students
”的集合。
更新上一节中的 executeStudentCrudOperations()
函数
export async function executeStudentCrudOperations() {
const uri = process.env.DB_URI;
let mongoClient;
try {
mongoClient = await connectToCluster(uri);
const db = mongoClient.db('school');
const collection = db.collection('students');
} finally {
await mongoClient.close();
}
}
现在,您已经设置好数据库和集合,可以使用 insertOne()
创建一个新文档。要创建一个 文档
createStudentDocument
的异步函数,并将 collection
作为参数传递。studentDocument
的对象,并将学生的信息存储在其中。await
,将新创建的对象作为参数传递给 insertOne()
。将以下函数复制粘贴到您的“src/studentsCrud.js
”文件中,紧接在 connectToCluster
函数导出之后。
export async function createStudentDocument(collection) {
const studentDocument = {
name: 'John Smith',
birthdate: new Date(2000, 11, 20),
address: { street: 'Pike Lane', city: 'Los Angeles', state: 'CA' },
};
await collection.insertOne(studentDocument);
}
编写好函数后,您必须调用它。在 executeStudentCrudOperations()
中的 try
块内,在定义了集合之后,调用 createStudentDocument()
。确保使用 await,以便脚本在退出之前等待函数执行。
export async function executeStudentCrudOperations() {
const uri = process.env.DB_URI;
let mongoClient;
try {
mongoClient = await connectToCluster(uri);
const db = mongoClient.db('school');
const collection = db.collection('students');
console.log('CREATE Student');
await createStudentDocument(collection);
} finally {
await mongoClient.close();
}
}
在终端中执行“src/index.js
”脚本
node src/index.js
您应该在终端看到“CREATE Student”的消息被记录。要验证文档是否已创建,导航到您的 MongoDB Atlas 实例,并选择 Browse Collections。选择后,您应该看到您刚刚创建的新数据库、集合和文档。
尽管您没有提供 _id
字段,但请注意文档中有一个 id 字段。这是因为如果您没有提供 id 字段,数据库将自动为文档创建一个唯一的 id。
您可以使用 find() 方法从数据库中检索文档。这需要您传递一个包含可选属性的查询对象来过滤数据库。类似于 createStudentDocument()
函数,您将创建一个 findStudentsByName()
函数。
复制以下函数并将其添加到 createStudentDocument()
函数之后。
export async function findStudentsByName(collection, name) {
return collection.find({ name }).toArray();
}
在 try
块中调用此函数,并将检索到的文档持久化到新变量中。使用 console.log()
打印变量。确保注释掉对 createStudentDocument()
函数的调用。否则,脚本将创建一个包含相同信息和新id的新文档。
export async function executeStudentCrudOperations() {
const uri = process.env.DB_URI;
let mongoClient;
try {
mongoClient = await connectToCluster(uri);
const db = mongoClient.db('school');
const collection = db.collection('students');
// console.log('CREATE Student');
// await createStudentDocument(collection);
console.log(await findStudentsByName(collection, 'John Smith'));
} finally {
await mongoClient.close();
}
}
在终端中执行脚本
node src/index.js
您应该在终端上看到 studentDocument
对象。
为了尝试,将名称更新为 John 并观察发生了什么。
使用 updateOne()
方法来更新文档。此方法有两个必需的参数
让我们创建一个函数,用于使用指定名称更新文档的指定字段
export async function updateStudentsByName(collection, name, updatedFields) {
await collection.updateMany(
{ name },
{ $set: updatedFields }
);
}
调用此函数,然后再次调用 findStudentsByName()
以验证文档已被更新。
export async function executeStudentCrudOperations() {
const uri = process.env.DB_URI;
let mongoClient;
try {
mongoClient = await connectToCluster(uri);
const db = mongoClient.db('school');
const collection = db.collection('students');
// console.log('CREATE Student');
// await createStudentDocument(collection);
console.log(await findStudentsByName(collection, 'John Smith'));
console.log('UPDATE Student\'s Birthdate');
await updateStudentsByName(collection, 'John Smith', { birthdate: new Date(2001, 5, 5) });
console.log(await findStudentsByName(collection, 'John Smith'));
} finally {
await mongoClient.close();
}
}
再次执行脚本
node src/index.js
您应该能够比较记录的文档——更新前后的差异。如果您刷新您的 MongoDB Atlas 页面,您也应该看到更新的文档。
要从数据库中删除文档,请使用 deleteMany() 方法。此方法将其第一个参数指定为要删除的文档的对象。
让我们创建一个函数,在 updateStudentsByName()
函数之后删除所有具有指定名称的文档
export async function deleteStudentsByName(collection, name) {
await collection.deleteMany({ name });
}
在 try
块中调用此函数。您也可以取消注释之前的函数调用。
export async function executeStudentCrudOperations() {
const uri = process.env.DB_URI;
let mongoClient;
try {
mongoClient = await connectToCluster(uri);
const db = mongoClient.db('school');
const collection = db.collection('students');
console.log('CREATE Student');
await createStudentDocument(collection);
console.log(await findStudentsByName(collection, 'John Smith'));
console.log('UPDATE Student\'s Birthdate');
await updateStudentsByName(collection, 'John Smith', { birthdate: new Date(2001, 5, 5) });
console.log(await findStudentsByName(collection, 'John Smith'));
console.log('DELETE Student');
await deleteStudentsByName(collection, 'John Smith');
console.log(await findStudentsByName(collection, 'John Smith'));
} finally {
await mongoClient.close();
}
}
最后一次执行脚本
node src/index.js
您应该看到在 deleteStudentsByName()
函数执行后没有找到指定名称的文档。刷新 MongoDB Atlas 页面。您将看到文档已被删除。
npm install mongodb --save
。这将下载 MongoDB Node.js 驱动并将其添加到 package.json 文件中的依赖项条目。要初始化 MongoDB 应用,请创建一个新目录,然后从当前工作目录移动到新创建的目录。一旦进入目录,您可以使用 npm init -y
。标志自动接受命令的默认值。
mkdir node-mongoDB && cd node-mongoDB
npm init -y
npm install mongodb --save
。这将下载MongoDB Node.js驱动程序并在package.json文件中添加一个依赖项条目。npm install mongodb --save
。这将下载MongoDB Node.js驱动程序并在package.json文件中添加一个依赖项条目。npm install mongodb
来使用npm MongoDB。这个命令会下载Node.js官方的MongoDB驱动程序及其安装所需的依赖项。安装MongoDB后,您首先需要在文件顶部导入MongoClient。导入后,创建一个新的MongoClient实例,并将连接字符串作为参数传递。然后,使用connect方法连接并处理您的数据。有关详细信息,请参阅此教程。
MongoDB Node.js驱动程序是Node.js应用程序连接和与MongoDB通信的接口。驱动程序提供了一个异步的API,允许Node.js应用程序处理数据。
按照以下步骤启动MongoDB
使用connect方法进行连接。
有关详细信息,请参阅此教程。
npm update是一个命令,用于将package.json中存在的所有模块更新到最新版本。使用npm update后跟包名来更新包。例如,要更新MongoDB,可以使用npm update mongodb
。
Node.js是建立在Google Chrome的V8 JavaScript引擎之上的JavaScript运行时。另一方面,npm是一个工具,允许用户安装第三方库。
npm i -g npm@latest
。要更新npm到特定版本,您可以运行npm i -g [email protected]
。