【.com速译】MongoDB是最早的NoSQL数据存储之一,也是目前流行的NoSQL数据存储。Node.js的JavaScript运行时继续主导后端开发。它们共同构成了高度灵活和动态的技术堆栈。Node.js和MongoDB允许快速实现基本的应用程序功能,例如CRUD(创建、读取、更新和删除)操作。在本文中,我们将使用最新的Node.jsMongoDB驱动程序(版本3.6+)来学习CRUD基础知识。Node.js和MongoDB安装首先在您的系统上安装Node.js和MongoDB,以及一个包含“curl”可用命令的命令行。(如果您使用的是2018年的Linux、MacOS或Windows10版本,您可能正在使用[curl](https://curl.se/)。)为您的系统下载MongoDB后,您可以将其作为服务安装或作为可执行文件运行。无论哪种方式,请通过打开命令行并运行`mongo`命令来确保MongoDB正在运行。(如果它没有作为服务安装,您可能需要将此命令添加到您的路径中。)这使您可以访问在您的系统上运行的MongoDB实例。接下来,确保安装了Node.js和npm。在命令行中,键入“node-v”。如果您安装了Node.js,您将获得版本号。如果没有,您将需要下载Node.js并将其安装在您的计算机上。Curl允许从命令行执行简单的HTTP请求。例如,运行`curlwww.google.com`将从Google主页接收标记。创建一个Node.js项目在文件夹中创建一个类型为npminit的新项目。项目名称可以使用node-mongo-intro。当然,您也可以接受其他默认值。添加所需的依赖项。在您刚刚创建的项目目录中,键入`npminstallmongodbpolka--save`。这将为MongoDB安装Node.js驱动程序(允许项目访问MongoDB)和用于处理HTTP请求的PolkaHTTP服务器。编辑package.json文件以包含启动脚本,如清单1所示。清单1.启动脚本,然后创建一个/node-mongo-intro/src/index.js文件并将清单2的内容放入其中。清单2.index.js中的HTTP测试constpolka=require('polka');polka().get('/create',(req,res)=>{res.end(`works`);})。listen(3000,err=>{if(err)throwerr;console.log(`>Runningonlocalhost:3000`);});现在使用`npmrunstart`启动服务器。服务器会监听3000端口,可以使用curlhttp://localhost:3000/create来测试。测试后您应该会看到“有效”响应(以及一些curl请求信息)。在MongoDB中插入记录现在我们将执行一个简单的插入。这是CRUD中的“C”。将`index.js`文件更新为如清单3所示。清单3.一个简单的插入constpolka=require('polka');const{MongoClient}=require("mongodb");polka().get('/create',(req,res)=>{constclient=newMongoClient("mongodb://localhost:27017");asyncfunctionrun(){try{awaitclient.connect();constdatabase=client.db("intro");constcollection=database.collection("quotes");constresult=awaitcollection.insertOne({"quote":"生活就是你忙于制定其他计划时发生的事情。"});res.end(JSON.stringify(result));}catch(e){console.log("Error:"+e);}最后{awaitclient.close();}}run().catch(console.dir);}).listen(3000,err=>{if(err)throwerr;console.log(`>Runningonlocalhost:3000`);});清单3中的代码打开与本地系统上MongoDB实例的连接,然后指定一个数据库(`"intro"`)和Collection(`"quotes"`)。集合类似于关系数据库中的表。接下来,代码插入一个文档(类似于SQL记录)并在HTTP响应中发送结果。要先运行插入,请按Ctrl-C停止并重新启动节点服务器。然后在命令行运行这个命令:npmrunstartcurlhttp://localhost:3000/createverifyinsert如果你很好地掌握了SQL技能,你会注意到一件事,我们在执行之前没有创建表和模式这项工作。我们甚至没有创建我们使用的数据库。因为MongoDB为我们做了所有这些工作,所以它可以接受任何类型的结构化键值文档到集合中。使用mongo打开mongoshell,输入命令useintro。这将切换到自动创建的介绍数据库。现在输入db.quotes.find()命令,您将看到插入的记录。请注意,MongoDB将在“_id”字段上自动生成一个唯一ID。您可以通过在文档中自己指定一个来覆盖它。在MongoDB中检索文档现在让我们取出文档。添加清单4中所示的.get()映射。这是CRUD中的“R”。清单4.检索文档。get('/retrieve',(req,res)=>{constclient=newMongoClient("mongodb://localhost:27017");asyncfunctionrun(){try{awaitclient.connect();constdatabase=client.db("intro");constcollection=database.collection("quotes");constcursor=collection.find({},{});letitems=[];awaitcursor.forEach(function(doc){items.push(doc);});res.end(JSON.stringify(items));}catch(error){console.warn("ERROR:"+error);if(errCallback)errCallback(error);}finally{awaitclient.close();}}run().catch(console.dir);})清单4以与清单3相同的方式连接,然后发出带有空查询的`find`命令。这意味着它匹配所有文档。接下来,它获取响应并将它们编组到一个数组中以发送回客户端。请注意,游标操作和集合是异步的。清单3中的collection.insertOne也是如此。我们使用await关键字来处理这些而不是嵌套回调。使用curlhttp://localhost:3000/retrieve测试新端点(在停止并再次启动服务器后),您将看到返回的集合。MongoDB中的更新文档现在在CRUD中是“U”。清单5处理了这个问题。清单5.更新文档。get('/update',(req,res)=>{constclient=newMongoClient("mongodb://localhost:27017");asyncfunctionrun(){try{awaitclient.connect();constdatabase=client.db("intro");constcollection=database.collection("quotes");constupdateDoc={$set:{author:"JohnLennon",},};constresult=awaitcollection.updateOne({},updateDoc,{});//<--空过滤器匹配所有docsres.end("Updated:"+result.modifiedCount);}catch(e){errCallback(e);}finally{awaitclient.close();}}run().catch(console.dir);})清单5再次连接到数据库,然后创建更新文档。该文档通过指定包含要更改的字段和值的`$set`对象的字段来告诉MongoDB要更改什么。在我们的例子中,我们将`author`字段设置为`"JohnLennon"`,即相关引用的引用者。接下来,清单5使用`updateOne()`函数执行文档更新。最后一个空对象参数是过滤器。在这种情况下,我们要匹配所有文档,所以我们将其留空。最后,我们发回我们更新的文档数量(一个)。MongoDB中删除文档CRUD的最后一个字母是“D”,表示删除。删除操作的映射如清单6所示。清单6.删除文档。get('/delete',(req,res)=>{constclient=newMongoClient("mongodb://localhost:27017");asyncfunctionrun(){try{awaitclient.connect();constdatabase=client.db("intro");constcollection=database.collection("quotes");constquery={};constresult=awaitcollection.deleteOne(query);if(result.deletedCount===1){res.end("成功删除一个文档。");}else{res.end("删除0个文档。");}}finally{awaitclient.close();}}这里我们再次使用空查询来匹配所有`"quotes"`集合中的文档。异步`collection.deleteOne()`函数返回一个结果,告诉我们有多少文档受到影响。重新启动服务器(Ctrl-C)并发出新的curl命令:curlhttp://localhost:3000/delete可以使用curlhttp://localhost:3000/retrieve验证文件是否被删除。【翻译请注明原译者及出处为.com】
