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

朋友们,又一课程推出 “数据库” 明天就要举行,所以我们举办了传统的公开课,你可以观看录音 这里。 这次我们谈论流行的 MongoDB 数据库:我们研究了一些微妙之处,了解了操作、功能和架构的基础知识。 我们还谈到了一些用户案例。

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

举办了网络研讨会 伊万·贝尔特,Citymobil 服务器开发主管。

MongoDB 特性

MongoDB的 是一个开源的面向文档的 DBMS,不需要表模式的描述。 它被归类为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:

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

现在我们来写传统的 你好世界:

print (“Hello world!”)

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

在那之后 - 让我们开始循环:

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

正如你所注意到的,在我们之前 普通JS, MongoDB 是一个成熟的 JavaScript 解释器.

何时使用 MongoDB?

有一个故事,硅谷的初创公司一般都是一周前打开《HTML for Dummies》这本书的人。 他会选择哪一个堆栈? 同意,出于显而易见的原因,当他的浏览器中有 JavaScript、Node.js 在服务器上运行、并且 JavaScript 也在数据库中运行时,这对他来说非常方便。 这是第一点。

其次,有 很好的表现;很好的绩效 Peter Zaitsev,俄罗斯最好的数据库专家之一。 在其中,Peter 谈论了 MySQL 和 MongoDB,特别注意何时以及什么最好使用。

第三,我想强调一下,MongoDB的特点是好的 可扩展性 - 这是数据库的关键功能之一。 如果您事先不知道负载是什么,MongoDB 是完美的。 此外,它还支持开箱即用的模式,例如 分片 и 复制,而且这一切都做得相当透明,就是工作起来非常方便。

至于 术语 在 MongoDB 中:

  • 数据库是数据库(方案、表的集合);
  • 在 MongoDB 中有这样的东西 一个集合 - 这是一个表格和一组文档的类似物,在逻辑上应该连接起来;
  • 文档类似于字符串。

数据库创建和简单查询

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

use learn

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

现在让我们对文档进行一个小的插入。 例如,假设它是一只名为 Aurora 的独角兽:

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

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

该对象有哪些命令? db:

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

那么,让我们回到我们的命令,结果控制台将报告已插入一行:

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

unicorns 在一个团队中 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 表示一个集合。 请注意,我们没有描述或创建该集合,只是简单地写了“独角兽”,做了插入,然后我们就有了一个集合。

这就是我们如何能够 获取我们所有的收藏:

db.getCollectionNames()

等等。 能 插入另一个 收藏:

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

现在我们问一下 完整收藏 (我们提醒您,在我们的例子中,数据库已经包含有关两个同名独角兽的信息):

db.unicorns.find()

请注意,这是我们的 JSON(有姓名、性别、体重、一些唯一的对象标识符):

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

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

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

让我们看看发生了什么:

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

如您所见,我们还有其他字段: 主页 и 蠕虫,这是极光所没有的。

让我们再添加一些独角兽:

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 插入了另外四个对象:

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

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

答案是显而易见的——在 Monga 中,上面的例子很好地说明了这一点。 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});

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

现在请注意文档。 作为 时代 我们存储整个对象。 还有关于独角兽喜欢什么的信息,但并不是每个人都有这些信息。 所以里面有谎言 全阵列.

顺便说一句,为了更美观地显示结果,可以调用搜索命令末尾的方法 .pretty():

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

如果您需要获得 有关最新错误的信息,使用以下命令:

db.getLastError()

这可以在每次插入后完成,也可以配置 Write Concern。 最好阅读有关它的内容 官方文档,顺便说一句,这在 Monga 中提供了非常丰富的信息。 顺便说一句,它也可以在 Habré 上找到 好文章 这个。

让我们继续进行更复杂的查询

查询精确字段值:

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

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

你也可以做 一次查询多个字段:按性别和体重:

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

以上,特别注意 $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”运算符搜索数组:

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

下面的例子将向我们展示 使用 $all 运算符进行搜索。 这里的顺序并不重要:

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

我们也可以 按数组大小搜索:

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

但是如果我们想找到一个大小大于一的数组怎么办? 有一个运营商可以做到这一点 $哪里,用它你可以编写更复杂的东西:

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

顺便说一句,如果你想练习的话, 你在那里 带有命令的文件。

光标特性

稍微跑题一下,说一下Monga的特点:

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

打字 db.unicorns.find 如果不加括号,我们会得到提示:

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

我们继续满足要求

还有 $in 运算符:

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

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

现在我们来谈谈更新。 例如,让我们更改 Rooooodles 独角兽的重量:

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

由于我们的行动,该文件 将彻底更新,并且其中仅保留一个指定字段:

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

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

您可以使用以下方法纠正这种情况 $设置:

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

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

还有一种可能 增量值:

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

然后有 插入 - 更新和插入的组合:

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

这是如何完成的 领域选择:

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

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

还需要补充几句 跳过 и 限制:

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

各位同事,就这些了,如果你们想了解详情的话, 观看整个视频。 并且不要忘记留下您的评论!

来源: habr.com

添加评论