公开网络研讨会“ MongoDB基础知识”

朋友, 数据库课程的下一次发布将于明天举行,因此我们举办了传统的公开课,您可以在此处查看录音。 这次我们讨论了流行的MongoDB数据库:研究了一些细微之处,研究了工作,功能和体系结构的基础知识。 并且还涉及了一些用户案例。



网络研讨会由Citimobil服务器开发主管Ivan Remen主持。


MongoDB功能


MongoDB是一个开放源代码的面向文档的数据库管理系统,不需要对表模式进行描述。 它被分类为NoSQL,并使用BSON(二进制JSON)。 可以直接使用C ++进行扩展,并支持JavaScript语法。 不支持SQL。

MongoDB具有许多流行编程语言(C,C ++,C#,Go,Java,JavaScript,Perl,PHP,Python,Ruby等)的驱动程序。 对于其他编程语言,也有非官方的和社区支持的驱动程序。

好吧,让我们看一下可能有用的基本命令。

因此,要在Docker中部署MongoDB ,我们需要编写:

docker run -it --rm -p 127.0.0.1:27017:27017 --name mongo-exp-project mongo docker exec -it mongo-exp-project mongo 

因此,MongoDB 客户端启动



现在让我们编写传统的Hello World

 print (“Hello world!”) 



之后, 运行循环



正如您所注意到的,我们前面是常规的JS而MongoDB是成熟的JavaScript解释器

何时使用MongoDB?


有个故事说,硅谷的普通初创企业是一周前打开“ HTML for Dummies”一书的人。 他将选择哪个堆栈? 您必须承认,由于明显的原因,当他的浏览器中装有JavaScript,Node.js在服务器上运行以及JavaScript也在数据库中时,这对他来说非常方便。 这是第一点。

其次,俄罗斯最好的数据库专家之一Peter Zaitsev 作了精彩的演讲 。 在其中,Peter讨论了MySQL和MongoDB,重点介绍了什么时候使用什么以及什么是最佳使用。

第三,我想强调的是MongoDB具有良好的可伸缩性 -这是数据库的关键功能之一。 如果您事先不知道负载会是多少,MongoDB就是完美的选择。 另外,它支持分片复制等现成的模式,所有这些都变得相当透明,也就是说,非常方便工作。

至于MongoDB中的术语 ,则:

  • 底数是底数(方案,表的总数);
  • 在MongoDB中,有一个集合(collection )之类的东西-它是一个表和一组文档的类似物,应根据事物的逻辑进行连接;
  • 文档是一行的类似物。

数据库创建和简单查询


要创建数据库,您只需要开始使用它:

 use learn 



现在插入一小部分文档。 例如,以一个名为Aurora的独角兽为例:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 

db是用于访问数据库的全局对象,也就是说,实际上是“ monga”本身。 对于分片,使用sh ;对于复制,使用rs

db对象具有哪些命令:



因此,请回到我们的团队,其结果是控制台将报告已插入一行:



db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})的单词db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})表示集合。 请注意,在这里我们没有描述或创建集合,只是简单地写了“ unicorns”,插入了,就得到了一个集合。

这样我们就可以获取所有集合

 db.getCollectionNames() 

等等。 我们可以插入另一个集合:



现在,我们将请求一个完整的集合 (回想一下,在我们的例子中,数据库已经包含有关两个同名独角兽的信息):

 db.unicorns.find() 

请注意,这是我们的JSON(有名称,性别,重量和对象的某些唯一标识符):



现在让我们再插入几个同名的独角兽:

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false}) 

让我们看看发生了什么:



如您所见,我们还有其他字段: homeworm ,而Aurora没有。

再添加一些独角兽:

 db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, {name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, {name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, {name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}]) 

因此,我们使用JavaScript插入了另外四个对象:



您认为将护照数据存储在哪个数据库中更方便:在关系数据库中还是在mong中?

答案是显而易见的-上面的例子很好地说明了这一点。 在俄罗斯联邦,KLADR令人痛苦已不是什么秘密。 monga很好地落在地址上,因为您可以将所有内容指定为数组,并且生活起来会容易得多。 这对于MongoDB是一个很好的用户案例

添加更多独角兽:

 db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 



现在注意文件。 作为dob ,我们存储整个对象。 此外,还有独角兽喜欢的信息,并非每个人都有此数据。 因此,里面是一个完整的数组

顺便说一句,为了获得更漂亮的输出,可以在搜索命令末尾调用.pretty()方法:



如果需要获取有关上一个错误的信息 ,请使用以下命令:

 db.getLastError() 

可以在每次插入后完成,也可以配置“写入关注点”。 最好在官方文档中进行阅读,顺便说一下,该文档在很多方面都非常有用。 顺便说一句,关于这个主题也有一篇很好的文章

继续进行更复杂的查询


请求准确的字段值:

 db.unicorns.find({gender: 'm'}) 

通过编写这样的请求,我们在控制台的输出中获得了所有雄性独角兽的列表。

您还可以立即在几个字段中运行查询 :按性别和体重:



在上方,请注意特殊的$ gt选择器 ,该选择器可显示所有重量超过700的雄性独角兽。

您可以检查该字段是否存在

 db.unicorns.find({vampires: {$exists: false}}) 

大概:

 db.unicorns.find({'parents.father': {$exists: true}}) 

以下命令显示名称以字母A或a开头的独角兽

 db.unicorns.find({name: {$regex: "^[Aa]"}}) 

现在让我们看一下数组搜索 。 问题编号1:此命令将输出什么:

 db.unicorns.find({loves:'apple'}) 

是的:每个喜欢苹果的人。

以下命令将仅返回仅包含苹果和西瓜的独角兽数据

 db.unicorns.find({loves:[ "apple", "watermelon" ]}) 

还有一个命令:

 db.unicorns.find({loves:[ "watermelon", "apple" ]}) 

在我们的例子中,它不会返回任何内容,因为当我们传递一个数组时,第一个元素与第一个元素进行比较,第二个元素与第二个元素进行比较,依此类推。也就是说,该数组还必须这些值的位置上重合。

这是使用OR运算符进行数组搜索的样子:



以下示例将向我们展示使用$ all运算符进行的搜索 。 在这里,该序列已经不再是原则了:



我们还可以通过数组的大小进行搜索:



但是,如果我们想找到一个大于一个的数组怎么办? 有一个$ where运算符,您可以用它来编写更复杂的东西:

 db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } }) 

顺便说一句,如果您想练习, 这里是一个包含命令文件。

光标功能


让我们讲一点点,对monga的功能说几句话:

  • find()和其他操作不返回数据-它们返回所谓的“游标”;
  • 我们在打印数据时看到的是解释器的工作。

通过输入不带括号的db.unicorns.find ,我们得到一个提示:



我们继续满足要求


还有$ in运算符:

 db.unicorns.find({weight: {$in: [650, 704]}}) 



现在让我们谈谈update 。 例如,让我们更改独角兽Roooooodles的重量:

 db.unicorns.update({name: "Roooooodles"}, {weight: 2222}) 

由于我们的行动,该文档将被完全更新 ,并且其中仅保留一个指定的字段:



也就是说,我们的对象唯一剩下的就是2222的权重,当然还有id。

您可以使用$ set来解决此问题:

 db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}}) 




也可以增加值



还有upsert-更新和插入的组合:



这是如何选择字段





剩下的几句话是关于跳过限制



同事,仅此而已,如果您想了解详细信息,请观看整个视频 。 并且不要忘记发表您的评论!

Source: https://habr.com/ru/post/zh-CN474054/


All Articles