朋友, 数据库课程的下一次发布将于明天举行,因此我们举办了传统的公开课,您可以在此处查看录音。 这次我们讨论了流行的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})
让我们看看发生了什么:

如您所见,我们还有其他字段:
home和
worm ,而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-更新和插入的组合:

这是如何
选择字段 :


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

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