【.com速译】NoSQL数据存储让数据管理更加灵活,彻底改变软件开发的局面。MongoDB是著名的NoSQL解决方案之一,是一个面向文档的数据存储系统。本文探讨什么是MongoDB以及它如何满足您的应用程序需求。MongoDB:一种文档数据存储系统关系数据库,将信息存储在严格规范的表和列中。MongoDB是一个文档存储系统,将信息存储在集合和文档中。这里的主要区别在于集合和文档是非结构化的,有时称为无模式。这意味着MongoDB实例(集合和文档)的结构不是预定义的,并且可以灵活地适应放入其中的任何数据。文档是一个键值集,其行为很像JavaScript等代码中的对象:它的结构会根据放入其中的数据而变化。这使得针对MongoDB等数据存储的编程比针对关系数据存储的编程更容易、更灵活。简而言之,应用程序代码和文档数据存储系统之间的交互感觉更自然。图1直观地显示了MongoDB数据库、集合和文档的结构。图1.MongoDB文档存储系统这种类型的数据建模的固有灵活性意味着可以更按需处理数据,从而带来这里描述的性能优势。要详细了解这种差异,让我们比较一下完成同一任务(创建记录,然后从应用程序添加字段)的以下两种方法,首先是关系数据库,然后是MongoDB。关系数据库中的步骤:#createadatabase:CREATEDATABASEmenagerie;#createatableinthedatabase:USEmenagerie;CREATETABLEpet(nameVARCHAR(20));#connecttothedatabaseinappandissueinsert:INSERTINTOPet(name)VALUES('FriarTuck');#addacolumn:ALTERTABLEpetADDtypeVARCHAR(20)ist;ing#update:exist;ingUPDATEpetSETtype='cat'WHEREname='FriarTuck'现在对MongoDB执行相同的过程:#connecttothedatabaseinappandissueinsert:usemenagerie;db.pet.insertOne({name:"friartuck"});#issueupdate:db.pet.updateOne({name:'friartuck'},{$set:{type:'cat'}});从上一节可以看出MongoDB的开发体验是多么的顺畅。这种灵活性当然给开发人员带来了避免模式膨胀的负担。导航大型应用程序的文档结构至关重要。MongoDB中的ID字段有关系型数据库中主键的概念,通常是合成的ID列(即生成的与业务数据无关的值)。在MongoDB中,每个文档都有一个用于类似目的的_id字段。如果开发人员在创建文档时没有提供ID,MongoDB引擎将自动生成一个(作为UUID)。与主键一样,_id字段会自动建立索引并且必须是唯一的。MongoDB中的索引MongoDB中的索引的行为类似于关系数据库中的索引:它创建关于文档字段的附加数据以加速依赖于该字段的查询。MongoDB使用B树索引。可以使用以下语法创建索引:db.pet.createIndex({name:1})参数中的整数表示索引是升序(1)还是降序(-1)。MongoDB中的嵌套文档MongoDB面向文档结构的一个强大方面是文档可以嵌套。例如,您可以创建嵌套文档,而不是创建另一个表来存储宠物文档的地址信息,如代码片段1所示。代码片段1.嵌套文档示例{"_id":"5cf0029caff5056591b0ce7d","name":"FriarTuck","address":{"street":"FelineLane","city":"BigSur","state":"CA","zip":"93920"},"type":"cat"}MongoDB中的非规范化MongoDB等文档存储系统对join的支持有限,没有外键的概念。两者都是数据结构动态特性的结果。MongoDB中的数据建模有利于非规范化,即在文档中复制数据,而不是将数据严格保存在表孤岛中。这提高了查找速度,但是以增加数据一致性维护为代价。非规范化不是必需的,在使用面向文档的数据库时更倾向于。这是由于改进了处理复杂嵌套记录的能力,而不是SQL倾向于将数据规范化为特定的单值列。MongoDB查询语言MongoDB中的查询语言是面向JSON的,就像文档结构一样。这促进了一种非常强大的表达式语法,甚至可以处理复杂的嵌套文档。例如,可以通过执行db.pet.find({"type":"cat"})查询所有猫的理论数据库,或者使用db.pet.find({"type":"cat","address.state":"CA"})查找加利福尼亚州的所有猫。请注意,查询语言会遍历嵌套的地址文档。MongoDB更新语法MongoDB的alter语法也使用类似JSON的格式,其中$set关键字表示将更改哪个字段以及将更改什么值。set对象通过点符号支持嵌套文档,如表示片段2所示,其中可以更改名为“FriarTuck”的猫的邮政编码。代码片段2.更新嵌套文件db.people.update({"type":"cat","name":"FriarTuck"},{$set:{"address.zip":"86004"}})可以作为您可以在片段2中看到,更新语法与其对应的SQL一样强大,实际上更强大。MongoDB云和部署选项MongoDB专为可扩展性和分布式部署而设计。它完全有能力处理大规模的工作负载。MongoDB在MongoDBAtlas中提供了多云数据库集群解决方案。MongoDBAtlas就像一个托管数据库,可以跨越不同的云平台,包括监控和容错等企业特性。不难看出MongoDB的重要性,所以AWS的AmazonDocumentDB产品就把兼容MongoDB作为一大卖点。Microsoft的AzureCosmosDB遵循类似的模式,支持MongoDBAPI。MongoDB中的高可用性MongoDB支持副本集以实现高可用性。核心思想是将数据一次写入主实例,然后复制到二级存储读取。在此处了解有关MongoDB中复制的更多信息(https://docs.mongodb.com/manual/replication/)。结论是MongoDB是领先的NoSQL解决方案,它兑现了灵活模式数据存储系统的承诺。高级驱动程序几乎适用于每种编程语言,您可以利用众多部署选项。原标题:什么是MongoDB?开发人员快速指南,作者:MatthewTyson
