如何使用MongoDB运行node.js

当今的许多Web应用程序都将node.js与MongoDB结合使用,以在后端服务器上存储和访问数据。 node.js不仅在访问非关系数据库(如MongoDB)方面出色,而且还为应用程序的服务器端带来了可伸缩性和速度。

随着MEAN(MongoDB,Express,Angular和Node)和MERN(MongoDB,Express,React和Node)堆栈的日益普及,NoSQL数据库(如MongoDB)对CRUD操作的熟练掌握是每个应用程序开发人员都应该拥有的。 幸运的是,它相当简单容易,尤其是在我们为您准备的美味教程中。

教程如何美味? 将Node.js与MongoDB结合使用真的比订购晚餐更简单吗? 继续阅读以找出答案!

在开始烹饪之前,让我们了解一下我们的食材。

Node.js

Node.js是用于应用程序后端JavaScript运行时环境。 基于Google的V8 JavaScript引擎,Node.js包含许多Web应用程序实现所需的组件和功能

Node.js的主要优势之一是其事件驱动的异步引擎的可扩展性 。 由于它继续执行队列中的其他任务,而不是等待客户端响应,因此它可以并行执行更多的操作,因此速度更快。

此外,Node.js支持使用npm工具快速安装第三方软件包和模块,本教程中还将使用该工具来安装MongoDB。

MongoDB

MongoDB是一个开源的非关系型数据库,以集合和文档的形式存储数据。 在设计时考虑到敏捷性和可伸缩性,MongoDB集合了关系数据库的丰富功能和键值存储的速度

与其将数据存储在行和列中(而不是像关系数据库一样), MongoDB而是以具有动态模式的集合的形式存储JSON文档 。 将所有相关信息存储在一起可以加快查询速度,而且由于MongoDB还被设计为异步使用,因此它为Node.js应用程序的数据提供了理想的存储库。

在本教程中,我们将在您的本地计算机上安装MongoDB,但是出于生产目的,您可能希望使用MongoDB Atlas云数据库服务。

环境设定

如果尚未这样做,请使用与您的操作系统和处理器匹配的文件在计算机上下载并安装MongoDB 。 安装后,从操作系统的命令提示符下运行MongoDB。 如果使用默认设置,则MongoDB侦听的端口将是27017。

现在我们已经准备好食材,是时候烹饪并互相介绍它们了。

1.安装MongoDB npm

无论您是要连接到MongoDB数据库还是要创建一个Node.js项目,都需要使用Node.js程序包管理器(npm)安装MongoDB程序包。 为此,请在您选择的IDE中打开一个终端窗口,然后键入:

npm install -g mongodb

这会将mongodb安装为全局库,因此您所有的Node.js项目都可以访问它并能够使用它。

2.连接到MongoDB

有了厨房(后端)和合适的食材, 就可以混合这些口味了在您的项目文件夹中创建一个名为server.js的文件。 顾名思义,这将是您的服务器,它将带出您在MongoDB数据库中拥有的菜肴 (或任何其他种类的数据)。

要允许Node.js作为客户端访问MongoDB,您需要在server.js文件中输入要求。

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

要将Node.js连接到计算机上本地运行的实际MongoDB数据库服务器,我们需要指定其URL。 如果您没有在设置过程中进行任何更改,则URL应为:

const url = 'mongodb://localhost:27017/';

使用Node.js在MongoDB上进行CRUD操作

使用server.js文件中的上述行,我们现在可以访问mongoClient的所有CRUD函数 。 CRUD代表创建,读取,更新和删除-您将在数据库上应用的基本功能。

因此,让我们从第一个开始:创建。

1.创建一个MangoDB数据库并将文档添加到集合中

在令人垂涎的Dinner项目中,我们将创建一个可以订购的菜肴数据库。 首先,我们将一个文档(一个盘)添加到数据库中名为盘(dishes)的集合中,我们将(非常不 dishesdb 地)命名为 dishesdb

现在介绍了如何使用MongoDB和Node.js进行精巧的部分– 您不必预先声明数据库和集合的名称 。 如果在调用它们时不存在它们,则在将文档插入集合中时将创建它们。

要将美味的菜肴(文档)插入菜单(集合),我们可以使用以下两种方法之一。 要添加一个菜,我们将使用 insertOne() ,并且一次添加多个菜,我们将使用 insertMany()

下面的代码一旦执行,将尝试将单个菜式“ Greens Fava Salad”添加到数据库dishsdb的收集菜式中 。 变量dbo用于引用我们的数据库(dishesdb),并在其中使用collection()方法创建一个名为dishs的collection()

由于本教程将不使用前端,因此我们将通过终端输出来跟踪服务器上发生的情况。 要查看脚本执行的结果,我们将使用console.log()并指定要显示的成功消息-将1个文档插入到收集盘中。

这是一个可将单个菜肴插入我们的数据库dishsdb的函数:

async function createOne(dbName, collectionName, newdish) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   await client.db(dbName).collection(collectionName).insertOne(newdish);
   console.log("1 document inserted into collection dishes");
   client.close();
 
 }

现在,我们需要做的就是定义一个新菜,然后调用该函数:

let newdish = { innerId: 1, title: 'Greens Fava Salad', description: 'Tossed greens with citrus dressing.', price: '$10'}; await createOne('dishesdb', 'dishes', newdish);

请注意, 在每次使用 client.close() 交互时都要 关闭 数据库连接 ,这一点很重要。 断开连接可能是一个安全漏洞,并且会导致错误和故障。

另外,如果您想简化代码并提高性能,则可以使用此方法在整个代码库中共享一个数据库连接

要对其进行测试,请将上面的代码添加到您的server.js文件中,并在终端中运行node server.js。 如果一切顺利,您应该收到消息–将1个文档插入收集盘中。

将多个项目插入您的收藏中非常相似。 您只需要使用insertMany()而不是insertOne()

这是一个将很多盘子插入我们的数据库dishsdb的功能:

async function createMany(dbName, collectionName, mydishes) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const res = await client.db(dbName).collection(collectionName).insertMany(mydishes);
   console.log("Number of dishes added:", res.insertedCount);
   client.close();
 }

现在,我们需要做的就是定义一些菜式,然后调用该函数:

let mydishes = [
    { innerId: 2, title: 'Seasonal Pumpkin Soup', description: 'Hot and filling Thai Pumpkin Soup.', price: '$13'},
    { innerId: 3, title: 'Fresh Vegetables', description: 'Freshly cut vegetables with olive oil and zest.', price: '$10'},
    { innerId: 4, title: 'New York Cheesecake', description: 'Delicious Cheesecake with an accompaniment of seasonal fruits.', price: '$20'},
    { innerId: 5, title: 'Chocolate Donut', description: 'Our chef\' s recipe for a chocolate donut.', price: '$15'},
    { innerId: 6, title: 'Watermelon Cocktail', description: 'A light alcoholic cocktail to cleanse your pallet.', price: '$17'}
    ];
await createMany('dishesdb', 'dishes', mydishes);

如您所见,除了每个菜的标题和描述之外,我们还为菜/文档添加了自己的唯一标识符( innerId ),以防止我们的Dinner菜单的标识方案与文档的MongoDB索引之间出现混淆。

现在我们已经在数据库中存储了一些文档,现在我们可以阅读它们了。

2.从MongoDB数据库读取

要从数据库读取,可以使用find()findOne() 。 要获取集合的所有内容,我们可以使用find()而不使用任何限定查询。

下面是一个使用函数find()来查找所有收集的文件的collectionName的数据库dbName

async function locateAll(dbName, collectionName) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const result = await client.db(dbName).collection(collectionName).find({}).toArray();
   console.log(result);
   client.close();
}

对数据库dishsdb和collection dish运行此函数如下所示:

await locateAll('dishesdb', 'dishes');

结果将是当前在“菜肴”集合中列出的所有6种菜肴。

我们可以通过向find()函数添加查询来使搜索更加具体。

例如,这是一个函数,除了dbNamecollectionName之外,还接受特定的查询。

async function locateByQuery(dbName, collectionName, myQuery) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const result = await client.db(dbName).collection(collectionName).find(myQuery).toArray();
   console.log(result);
   client.close();
 }

这是我们定义查询的方法,以查找所有价格为10美元的菜品,然后调用该函数。

let myquery = { price: '$10' }; await locateByQuery('dishesdb', 'dishes', myquery);<br>

如果我们只想查找一个特定的文档,可以使用findOne() 。 它的工作原理与find()差不多,除了它将始终返回单个对象–第一个与查询匹配的文档。 因此,如果将上面的代码更改为findOne()而不是find() ,则菜单上的第一个项目的价格为10美元。

以下是函数locateOneByQuery()

async function locateOneByQuery(dbName, collectionName, myQuery) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const result = await client.db(dbName).collection(collectionName).findOne(myQuery);            
   console.log(result);
   client.close();     
 }

3.更新MongoDB数据库中的文档

CRUD中的下一个操作是Update,顾名思义,它使我们可以更新MangoDB数据库集合中的文档。

与创建和阅读非常相似, 可以单次或批量完成文档更新 。 要更新一个文档,我们可以使用updateOne()updateMany()一次更改多个文档中的值。

使用 updateMany()可以更改与 query. updateOne() 匹配的多个文档的值 query. updateOne() query. updateOne()将更新第一个文档以使其与我们的集合相匹配。

这是一个用于更新一个文档的函数,该文档除了查询和新值外还需要dbName和collectionName:

async function renewOneByQuery(dbName, collectionName, myQuery, newValue) 
 {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const res = await client.db(dbName).collection(collectionName).updateOne(myQuery, newValue);
   console.log("number of documents updated:", res.result.nModified);                   
   client.close();     
 }

例如, 让我们通过更新名称和描述使汤更吸引人 。 从“季节性南瓜汤”中,我们将名称更改为“秋天南瓜汤”,并在说明中包括有关汤的独特特性的一些详细信息

这样做的代码如下所示:

let newQuery = { title: 'Seasonal Pumpkin Soup' };
    let newValue = { $set: {title: 'Autumn Pumpkin Soup', description: 'Hot and filling Bengali Pumpkin Soup.' }};
    await renewOneByQuery('dishesdb', 'dishes', newQuery, newValue);

如此开胃的名字和描述,我们的菜似乎价格低廉,您同意吗? 因此,让我们提高一些价格。

为了将所有价格为“ $ 10”的菜肴的价格更改为“ $ 20”,让我们创建一个函数,根据给定的查询一次更新许多文档。 函数代码如下所示:

async function renewManyByQuery(dbName, collectionName, myQuery, newValue) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const res = await client.db(dbName).collection(collectionName).updateMany(myQuery, newValue);
   console.log("number of documents updated:", res.result.nModified);   	  
   client.close();     
 }

定义查询和新值的代码如下所示:

  let newQuery = { price: '$10' };
    let newValue = { $set: {price: '$20' }};
    await renewManyByQuery('dishesdb', 'dishes', newQuery, newValue);

这会将菜1和3的价格从10美元更新为20美元。

4.从MongoDB数据库中删除文档

CRUD中的D代表Deletion ,所以这是我们要看的最后一个函数。 与创建,读取和更新一样,我们可以使用deleteOne()deleteMany()删除一个或多个文档。

要从菜单中删除单个项目,在本例中为innerId值为1的项目,我们首先将此函数添加到我们的server.js文件中:

async function removeOneByQuery(dbName, collectionName, myQuery) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const obj  = await client.db(dbName).collection(collectionName).deleteOne(myQuery);
   console.log("document deleted:", obj.result.n);  	
   client.close();     
 }

然后,我们将这样调用函数:

    let myQuery = { innerId: 1 }; await removeOneByQuery('dishesdb', 'dishes', myQuery);<br>

就像删除一个文档一样,我们可以删除多个文档。 这是删除适合给定查询的所有文档的功能:

async function removeManyByQuery(dbName, collectionName, myQuery) {
   const client = await MongoClient.connect(url, {useNewUrlParser: true});
   const obj  = await client.db(dbName).collection(collectionName).deleteMany(myQuery, newValue);
   console.log("document(s) deleted:", obj.result.n);   	
   client.close();     
 }

在这种情况下,我们将在不指定任何查询的情况下调用该函数,因此调用该函数将删除餐具集合中的所有文档:

await removeManyByQuery('dishesdb', 'dishes', {});

通过这些命令,我​​们几乎涵盖了将MongoDB与Node.js结合使用所需的所有知识。

下一步(一旦您抓了一些快吃的东西来满足我们刚给您的需求,就可以了)是添加一个前端和Express.js,以将您的应用程序与我们刚刚创建的后端互连。 有了这些功能,您就可以将我们烹制的Dinner扩展为具有视觉效果和UX的Web应用程序,以使用户垂涎三尺。


取得Codota


From: https://blog.codota.com/how-to-run-node-js-with-mongodb-2/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDBNode.js可以很好地配合使用MongoDB是一个非关系型数据库,而Node.js是一个基于JavaScript的服务器端运行环境。 要在Node.js使用MongoDB,首先需要安装MongoDB驱动程序。最流行的驱动程序是官方提供的`mongodb`驱动程序,可以通过npm进行安装。 ```bash npm install mongodb ``` 安装完驱动程序后,可以在Node.js使用以下代码连接到MongoDB数据库,并进行数据操作: ```javascript const MongoClient = require('mongodb').MongoClient; // 连接URL const url = 'mongodb://localhost:27017'; // 数据库名称 const dbName = 'mydatabase'; // 连接到MongoDB数据库 MongoClient.connect(url, function(err, client) { if (err) { console.log(err); return; } console.log('Connected successfully to server'); const db = client.db(dbName); // 在集合中插入一条数据 const collection = db.collection('mycollection'); collection.insertOne({ name: 'John', age: 30 }, function(err, result) { if (err) { console.log(err); return; } console.log('Inserted document:', result.ops[0]); client.close(); }); }); ``` 以上代码首先创建了一个`MongoClient`对象,然后使用`connect`方法连接到数据库。连接成功后,可以通过`db.collection`方法获取集合对象,并使用`insertOne`方法插入一条数据。 除了插入数据,还可以使用其他方法如`find`、`updateOne`、`deleteOne`等来进行查询、更新和删除操作。 MongoDB还支持更高级的查询操作,如聚合管道、索引等。你可以查阅官方文档或其他资源来学习更多有关MongoDBNode.js中的使用方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值