公告介绍 MongoDB 8.0,史上最快的 MongoDB!了解更多 >>介绍 MongoDB 8.0,史上最快的 MongoDB!>>

如何使用npm安装MongoDB

学习如何使用MongoDB的Node.js驱动程序与npm连接数据库并执行CRUD操作。

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依赖项

接下来,通过运行以下命令安装MongoDB驱动及其依赖项

npm install mongodb

npm install”命令的执行将花费几秒钟到一分钟,具体取决于您的网络连接。该命令将从npm公共注册表下载“mongodb”包到您的项目的“node_modules”目录。

创建MongoDB Atlas集群

对于本教程,您需要一个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(创建、读取、更新、删除)操作。

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 页面。您将看到文档已被删除。

结论

本教程只是触及了 MongoDB Node.js 驱动和 Atlas 的表面。MongoDB Node.js 驱动提供各种方法,包括但不限于聚合、插入和替换文档的方法。您还可以使用 Atlas 来 分发 和保护您的数据,为 优化 构建,并执行其他 功能

常见问题解答

如何使用 npm 安装 MongoDB?

要使用 npm 安装 MongoDB,请在根目录中执行 npm install mongodb --save。这将下载 MongoDB Node.js 驱动并将其添加到 package.json 文件中的依赖项条目。

如何初始化 MongoDB 应用 npm?

要初始化 MongoDB 应用,请创建一个新目录,然后从当前工作目录移动到新创建的目录。一旦进入目录,您可以使用 npm init -y。标志自动接受命令的默认值。

mkdir node-mongoDB && cd node-mongoDB
npm init -y

如何在 Windows 上使用 npm 安装 MongoDB?

在Windows上使用npm安装MongoDB,请在根目录下执行npm install mongodb --save。这将下载MongoDB Node.js驱动程序并在package.json文件中添加一个依赖项条目。

如何使用npm在Mac上安装MongoDB?

在Mac上使用npm安装MongoDB,请在根目录下执行npm install mongodb --save。这将下载MongoDB Node.js驱动程序并在package.json文件中添加一个依赖项条目。

是否可以在不从MongoDB网站下载的情况下使用npm MongoDB?

是的,您可以通过执行命令npm install mongodb来使用npm MongoDB。这个命令会下载Node.js官方的MongoDB驱动程序及其安装所需的依赖项。

如何使用Node.js运行MongoDB?

安装MongoDB后,您首先需要在文件顶部导入MongoClient。导入后,创建一个新的MongoClient实例,并将连接字符串作为参数传递。然后,使用connect方法连接并处理您的数据。有关详细信息,请参阅此教程

什么是Node.js?

MongoDB Node.js驱动程序是Node.js应用程序连接和与MongoDB通信的接口。驱动程序提供了一个异步的API,允许Node.js应用程序处理数据。

如何在Node.js中启动MongoDB?

按照以下步骤启动MongoDB

  • 使用npm安装MongoDB驱动程序。
  • 在文件顶部导入MongoClient。
  • 创建一个新的MongoClient实例,并将连接字符串作为参数传递。
  • 使用connect方法进行连接。

    有关详细信息,请参阅此教程

npm代表什么?

npm代表Node Package Manager。npm是一个开源项目,帮助开发者轻松共享包。它还提供了一个命令行客户端,允许开发者安装和发布这些包。

什么是npm update?

npm update是一个命令,用于将package.json中存在的所有模块更新到最新版本。使用npm update后跟包名来更新包。例如,要更新MongoDB,可以使用npm update mongodb

npm和Node之间有什么区别?

Node.js是建立在Google Chrome的V8 JavaScript引擎之上的JavaScript运行时。另一方面,npm是一个工具,允许用户安装第三方库。

npm包是免费的吗?

根据政策,使用npm Open Source是免费的。

npm可以更新自己吗?

要更新npm到最新版本,您可以运行npm i -g npm@latest。要更新npm到特定版本,您可以运行npm i -g [email protected]

npm和npm install是否相同?

npm是Node包管理器,而npm install是安装这些包的命令。