朋友们,又一课程推出
举办了网络研讨会
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:
现在我们来写传统的 你好世界:
print (“Hello world!”)
在那之后 - 让我们开始循环:
正如你所注意到的,在我们之前 普通JS, MongoDB 是一个成熟的 JavaScript 解释器.
何时使用 MongoDB?
有一个故事,硅谷的初创公司一般都是一周前打开《HTML for Dummies》这本书的人。 他会选择哪一个堆栈? 同意,出于显而易见的原因,当他的浏览器中有 JavaScript、Node.js 在服务器上运行、并且 JavaScript 也在数据库中运行时,这对他来说非常方便。 这是第一点。
其次,有
第三,我想强调一下,MongoDB的特点是好的 可扩展性 - 这是数据库的关键功能之一。 如果您事先不知道负载是什么,MongoDB 是完美的。 此外,它还支持开箱即用的模式,例如 分片 и 复制,而且这一切都做得相当透明,就是工作起来非常方便。
至于 术语 在 MongoDB 中:
- 数据库是数据库(方案、表的集合);
- 在 MongoDB 中有这样的东西 一个集合 - 这是一个表格和一组文档的类似物,在逻辑上应该连接起来;
- 文档类似于字符串。
数据库创建和简单查询
要创建数据库,您只需开始使用它:
use learn
现在让我们对文档进行一个小的插入。 例如,假设它是一只名为 Aurora 的独角兽:
db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})
db - 用于访问数据库的全局对象,实际上就是“monga”本身。 用于分片 sh,用于复制 - rs.
该对象有哪些命令? db:
那么,让我们回到我们的命令,结果控制台将报告已插入一行:
字 unicorns
在一个团队中 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})
表示一个集合。 请注意,我们没有描述或创建该集合,只是简单地写了“独角兽”,做了插入,然后我们就有了一个集合。
这就是我们如何能够 获取我们所有的收藏:
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})
让我们看看发生了什么:
如您所见,我们还有其他字段: 主页 и 蠕虫,这是极光所没有的。
让我们再添加一些独角兽:
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 插入了另外四个对象:
您认为在哪个数据库中存储护照数据更方便:关系数据库还是 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});
现在请注意文档。 作为 时代 我们存储整个对象。 还有关于独角兽喜欢什么的信息,但并不是每个人都有这些信息。 所以里面有谎言 全阵列.
顺便说一句,为了更美观地显示结果,可以调用搜索命令末尾的方法 .pretty()
:
如果您需要获得 有关最新错误的信息,使用以下命令:
db.getLastError()
这可以在每次插入后完成,也可以配置 Write Concern。 最好阅读有关它的内容
让我们继续进行更复杂的查询
查询精确字段值:
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 运算符进行搜索。 这里的顺序并不重要:
我们也可以 按数组大小搜索:
但是如果我们想找到一个大小大于一的数组怎么办? 有一个运营商可以做到这一点 $哪里,用它你可以编写更复杂的东西:
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]}})
现在我们来谈谈更新。 例如,让我们更改 Rooooodles 独角兽的重量:
db.unicorns.update({name: "Roooooodles"}, {weight: 2222})
由于我们的行动,该文件 将彻底更新,并且其中仅保留一个指定字段:
也就是说,我们的对象唯一保留的是权重 2222,当然还有 id。
您可以使用以下方法纠正这种情况 $设置:
db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}})
还有一种可能 增量值:
然后有 插入 - 更新和插入的组合:
这是如何完成的 领域选择:
还需要补充几句 跳过 и 限制: