MongoDB笔记一之简介与入门【第一次编辑:排版】

本文介绍了MongoDB的基础概念,包括其强大的数据存储能力、灵活性及扩展性特点。深入探讨了文档、集合和数据库等核心概念,并通过实例展示了如何利用MongoDB shell进行数据的创建、查询、更新与删除。

煮酒品茶:大量序语和实例引用自书中,品茶对其实验后做的笔记上载至博客,任何有版权的人都可以直接下架下文章,谢谢合作。

2012/8/14 14:00 MongoDB笔记一之简介与入门【第一次编辑:排版】

elain2012写的MongoDB 实战系列,真心不错!
 
MongoDB权威指南
 
第一章
MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,如辅助索引、范围查询和排序。MongoDB的功能非常丰富,比如内置的对MapReduce式聚合的支持,以及对地理空间索引的支持。
优点:
1、丰富的数据模型
MongoDB是面向文档的数据库,将原来的“行”(row),的概念换成更加灵活的“文档”(document)模型。
MongoDB没有模式:文档的键不会事先定义也不会固定不变。
2、容易扩展
采用的面向文档的数据模型使其可以自动在多台服务器之间分割数据,还可以平衡集群的数据和负载,自动重排文档,开发者可以专注于编写应用,需要更大的容量,只需在集群中添加新机器,然后让数据库来处理剩下的事。
3、丰富的功能
索引(多种快速查询,也提供了咱一的,复合的和地理空间索引能力。)
存储JavaScript(开发人员不必使用存储过程了,可以直接在服务端存储JavaScript的函数和值)
聚合(支持MapReduce和其它聚合工具)
固定集合(集合的大小是有上限的,对某些类型的数据【如:日志】特别有用)
文件存储(支持用一种容易使用的协议存储大型文件和文件的元数据)
4、不牺牲速度
5、简便的管理
主从复制,副本集,分片等。
 
第二章  入门
 
基本概念
----------------------------------------
文档是MongoDB中数据的基本单元。(doucument)
集合可以被看做是没有模式的表(collections)
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限。
MongoDB自带JavaScript shell,用于管理MongoDB实例和操和数据。
每一个文档都有一个特殊的键"_id",它在文档所处的集合中是咱一的。
-----------------------------------------
文档:多个键及其关联的值有序的放置在一起便是文档。(key:vlaue)
 {"cwtea" : "hello","key":"vlaue"}
注:文档中键的顺序并不重要。
 1、文档中的键/值对应是有序的
{"cwtea" : "hello","key":"vlaue"}和{"key":"vlaue","cwtea" : "hello"}完全不同
2、文档中的值可以是多种数据类型,整字,字符串,甚至文档。键可以使用任意UTF-8字符。
3、键不能含有\0(空字符),这个字符用来表示键的结尾。
4、.和$有特别的意义,只有在特定环境下才能使用。
5、以下划线"_"开头的键是保留的,虽然这个并不是严格要求的。
6、mongoDB区分类型和区分大小写
{"foo" : 3} 不同于{"foo" : "3"} 整数和字符串
{ "foo" : "3"}不同于{"Foo" : "3"} 大小写
7、mongoDB不能有重复的键
 
集合
概念:集合就是一组文档 collections

无模式
概念:不同文档可存在同一个集合中。

命名:
可以满足下列条件的任意UTF-8字符串。
1、集合名不能是空字符串""
2、集合名不能含 有\0字符(空字符),这个字符表示集合名的结尾.
3、集合名不能以"system."开发,这是为系统集合保留的前缀。
4、用户创建的集合名字不能含有保留字符$。有些驱动程序的确支持在集合名里面包含$,这是因为某些系统生成的集合中包含该字符。

子集合:
组织集合的一种惯例是使用 "." 字符分开的按命名空间划分的子集合。
GridFS是一种存储大文件的协议,使用子集合来存储文件的元数据,这样就与内容 分开了。
Web控制台通过子集合的方式将数据组织在DBTOP部分
绝大多数驱动程序都提供语法糖,为访问指定集合的子集合提供方便。
(db.blog代表blog集合,db.blog.posts代表blog.posts集合)

数据库:多个集合组成数据库。
一个MongoDB实例可承载多个数据库,它们之间可视为完全独立,每个数据库都有独立的权限控制,即便在磁盘上,不同的数据库存也放在不同的文件中。
命名:数据库名最终会变成文件系统里的文件,所以会有以下限制。
不能是空字符串("")
不得含有''(空格)、,、$、/、/和\0(空字符)
就全部是小写
最多64字节

保留的数据库名:
admin(是"root"数据库,添加一个用户到这个数据库,则具有最高权限)
local(这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合)
config(当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息)
 
命名空间:把数据库的名字放到集合名前面,得到就是集合的完全限定名db.blog.posts,命名空间的长度不得超过121,实际使用最好不超过100字节。
 
MongoDB shell
自带一个javascript shell,可以从命令行与MongoDB实例交互,可以执行管理操作,检查运行实例,变或做其他尝试。可以做javascript所做之事。
 > math.sin(math.pi /2)
Mon Aug 13 23:28:19 ReferenceError: math is not defined (shell):1
> Math.sin(Math.PI /2)
1
> new Date("2010/1/1")
ISODate("2009-12-31T16:00:00Z")
> new Date("2010/1/1");
ISODate("2009-12-31T16:00:00Z")
> "hello ,world!".replace("world", "mongodb")
hello ,mongodb!
> "hello ,world!".replace("world1", "mongodb")
hello ,world!
> "hello ,2".replace("2", "mongodb")
hello ,mongodb
> function factorial (n) {
... if (n <=1) return 1;
... return n * factorial(n-1)
... }
> factorial(5);
120

shell的基本操作:
创建、读取、更新和删除。
创建:
 > use blog
switched to db blog
> post = {"title" : "my blog post",
... "content" : "here is my blog post.",
... "date" : new Date()}
{
"title" : "my blog post",
"content" : "here is my blog post.",
"date" : ISODate("2012-08-13T16:24:51.467Z")
}
> db.blog.insert(post)
> db.blog.find()
{ "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") }
查询:find显示最多20条匹配
 > db.blog.findOne()
{
"_id" : ObjectId("50292a7870fc23d6b7514586"),
"title" : "my blog post",
"content" : "here is my blog post.",
"date" : ISODate("2012-08-13T16:24:51.467Z")
}
> db.blog.find({},{"title": 1} )
{ "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post" }
{ "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "two" }
update
更新:至少两个参数:第一个是要更新的文档的限定条件,第二个是新的文档。
 > post
{
"title" : "my blog post",
"content" : "here is my blog post.",
"date" : ISODate("2012-08-13T16:24:51.467Z")
}
> post.comments =[]
[ ]
> post
{
"title" : "my blog post",
"content" : "here is my blog post.",
"date" : ISODate("2012-08-13T16:24:51.467Z"),
"comments" : [ ]
}
> post.test="hello"
hello
> post
{
"title" : "my blog post",
"content" : "here is my blog post.",
"date" : ISODate("2012-08-13T16:24:51.467Z"),
"comments" : [ ],
"test" : "hello"
}
 #替换标题为my blog post的文章,第一个为条件,第二个为更新内容。
> db.blog.update({title : "my blog post"}, post)
> db.blog.find()
{ "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "two", "content" : ISODate("2012-08-13T16:28:10.372Z") }
{ "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" }
> db.blog.update({title : "two"}, {"title" : "baidu","content" : "www.cwtea.com" })
> db.blog.find()
{ "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" }
{ "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "baidu", "content" : "www.cwtea.com" }
删除:remove用来从数据库中永久性地删除文档
 > db.blog.remove({"title" : "baidu"})
> db.blog.find()
{ "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" }
#随时使用help
可以使用集合(javascript)

基本数据类型:
类似于JSON叫BSON的东西。
缺点:JSON没有日期类型,只有一种数字类型,没法区分浮点数和整数,更不能区分32位和64位数字,也没有办法表示其他常用类型,如正则表达式或函数。
MongoDB增加了其他一些数据类型:
null、布尔、32整数、64位整数、64位浮点数、字符串、符号、对象ID、日期、正则表达式、代码、二进制数据、最大值、最小值、未定义、数组、内嵌文档。
数字
日期:date()不等于new date()
数组:{"things" : ["pie",3.14]}
内嵌文档
 > lq = { "name" : "cwtea",
... "address" : {
... "a" : "1",
... "b" : "2",
... "c" : "3",
... }
... ,"hello" :"cwtea"}
{
"name" : "cwtea",
"address" : {
"a" : "1",
"b" : "2",
"c" : "3"
},
"hello" : "cwtea"
}
> db.blog.insert(lq)
> db.blog.find()
{ "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" }
{ "_id" : ObjectId("5029363070fc23d6b7514589"), "name" : "cwtea", "address" : { "a" : "1", "b" : "2", "c" : "3" }, "hello" : "cwtea" }

id和Objectld
存储文档必须有一个"_id"默认是个ObjectId对象。
ObjectId
 0-3[时间戳]4-6[机器]7-8[pid]9-11[计数器]

 

1.准备工作 中国专业IT社区优快云 (Chinese Software Developer Network) 创立于1999年,致力于为中国软件开发者提供知识传播、在线学习、职业发展等全生命周期服务。这里有许多IT精英分享技术、答疑解惑。不论是学习技术还是记录学习历程,优快云都是个很好的交流平台,赶紧加入吧! 1.1 请在优快云上注册,作业内容将以发布文章的形式提交 1.2 加入课程优快云社区 1.3 修改社区的昵称,昵称格式:学号姓名 1.4 关注老师的优快云博客: 汪璟玢老师: 优快云 1.5 学习使用Markdown文本语法撰写博客【参考附录教程1-2】 Markdown 是种轻量级的「标记语言」,它的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多。今后撰写作业文章都将用到Markdown来编写,请将优快云的默认编辑器设置为Markdown。 2.学习路线 在软件工程实践课程中,同学们可以利用个人编程作业、结对编程作业、团队项目作业,学习和熟练这项技术(因此,在挑选学习目标时,同学们需要考虑是否可以将该项技术应用到软工实践课程);接下来,请为你的学习目标绘制你的学习路线图和思维导图🚩,要求如下: 2.1 采用专业的思维导图软件,建议可以是:MindManager、XMind、iMindMap、FreeMind、Mindomo、 MindNode……等等之。推荐免费的Xmind。 2.2 绘制思维导图,包括但不限于以下内容:学习这门技术需要的精选的书本和网络资源、这个技术的方向和分支、入门掌握精通的学习路线图、入门掌握精通的三阶标准、 对应的岗位或应用研究方向的趋势了解和分析。 2.3 绘制路线图规划学习的时间计划,以这个学期,即6个月为周期,描述6个月内你打算学习这项技术的规划安排。 2.4 在博客中给出路线图和思维导图软件导出的图片 ⚠严禁直接COPY或抄袭现成的某个技术的路线图。路线图可以参考现有的,但必须博采众家之长,并有你自己的心血凝结其中。你绘制的路线图,从绘制到内容呈现,整体上必须是原创的。 附:之前课程中,同学们绘制的思维导图:思维导图1,完整博客1 ,思维导图2,完整博客2 ,思维导图3,完整博客3 3.往届学长学姐的建议 软件工程实践总结——It’s the end.૮(˶ᵔ ᵕ ᵔ˶)ა 结对编程是个开发者起合作编写代码的过程。这种合作可以促进共同思考和学习,促进团队之间的知识共享和技能提升。并且两个人起编程可以相互检查代码,减少错误和缺陷。通过结对编程,我可以提高代码质量、减少漏洞,并且在早期发现和纠正问题 软件工程实践总结──迄今为止最满意的成果 作为组长,审视个组员是否优秀,没有想象中的那么容易。因为我不是他,他是否具备独立解决问题的能力还真不好考察──真说不来他解决问题是完全靠自己,还是问了 ChatGPT 得到了个看似合理,但存在漏洞的答案。相较来看,和其他人协作的能力比较好考察,在开会时他的态度、在群里的发言等都可以反映出来。目前,我认为名合格的程序员应当能融入团队,积极参次讨论,贡献自己的想法;按时完成分配的任务,并及时向组长汇报完成情况 软件工程工实践总结–阳光总在风雨后 设计看似在项目中不起眼,但是真的值得我们花上大量的时间去完成,不仅仅是提供更好更清晰的展示,而且可以为后续的实现免去不必要的麻烦 挣脱束缚的步——软件工程实践总结 对象池常使用于大量游戏对象的维护上。作为游戏优化的大头,其实现可以很简单也可以很复杂,这里举例说明多类型对象池的学习记录。此处对象池异于引用池。在Unity中使用常用的对象池时,需要理解对象池的的原理和Unity的生命周期,而此处的“坑”也和种对象池的实现有关 软件工程实践总结——万变守其本,吾心持长青 α冲刺阶段是在先前准备完善的基础上进行正式的代码冲刺, 通过前期的几次合作磨合, α冲刺不管是在代码书写, 架构设计, 数据库设计上都变得更为容易、更加顺利, 组员在组长的带领下, 能够高效的完成自己的任务,发挥自己的能力,最终在α阶段结束时,我们已完成了任务大多数的内容,大大减轻了β冲刺的压力, 也是体现出前期准备的重要性 先进行部分模块测试可以节省时间。通常说来,我们在整合不同的模块时也会出现问题,例如模块之间的接口不匹配。但是如果我们能够信任各个组件的话,那么跟踪集成问题就会变得简单得多 投入足够的时间和资源进行全面的测试。包括单元测试、集成测试和系统测试,以确保代码的质量和系统的稳定性。自动化测试也是提高效率和减少人为错误的重要手段 测试工作通过对软件进行全面和严格的检验,可以发现软件存在的各种问题,以便及时修复和改进。这不仅确保软件达到高质量标准并满足需求,也推动软件不断完善和优化 设计阶段的工作十分关键而重要,相比需求阶段初步勾勒出产品雏形,设计阶段对软件进行全面而深入的设计,使软件变得更加具体、详细和全面 更多学长学姐的建议请查看他们的课程总结博客: 总结博客1 总结博客2 总结博客3 4.格式规则 4.1、为了方便其他学校的老师或者助教了解课程实况,请大家在作业开头添加作业的基本信息:(必做) 这个作业属于哪个课程 <班级的链接> 这个作业要求在哪里 <作业要求的链接> 这个作业的目标 <写上具体方面> 其他参考文献 … markdown代码 这个作业属于哪个课程|<班级的链接>| |-- |-- | |这个作业要求在哪里|<作业要求的链接>| |这个作业的目标|<写上具体方面>| |其他参考文献|... | 4.2、为了方便阅读以及助教评分,请大家在博客开头给出博文目录,作为内容的索引 务必包含以下大标题:思维导图和学习路线(标题含义近似即可,你可以个性化自己的标题,如我的过去、我的简历、我的展望、学习计划) 可以使用markdown的语法[toc],根据标题设置自动生成目录: @[toc] 作业基本信息... ## 回首过去 ### 问题1 ### 问题2 ### ... ## 立足当下 ... ## 展望未来 ... ## 思维导图和学习路线 ... 也可以结合html生成目录 作业基本信息... ## 目录: 1. [回首过去](#1) 2. [立足当下](#2) 3. [展望未来](#3) 4. [思维导图和学习路线](#4) ## <span id="1">1. 回首过去</span> ### 问题1 ### 问题2 ### ... ## <span id="2">2. 立足当下</span> ... ## <span id="3">3. 展望未来</span> ... ## <span id="4">4. 思维导图和学习路线</span> ... 4.3、作业提交规则 博客以班级作业页面的提交时间为准;需要提交的代码以codearts的提交时间为准; 博客需要在加入的社区中进行发布,请不要在个人账号中进行发布,另外,社区的文章编辑器和写文章编辑器稍微有些不同,请提交的时候查看清楚; 在这里插入图片描述 作业提交需要在对应作业下点击提交任务,上传对应的博客网页地址; 在这里插入图片描述 在这里插入图片描述 在deadline前交,分数为实际得分 ; 补交:在deadline 后两天内提交视为补交,分数为实际得分 * 50%;写了但是忘记提交作业和补交扣分致 缺交:在deadline 之后两天未补交视为博客缺交,分数为0分; 注意事项:每次作业记得保留markdown原文件,防止部分图片等内容因为版权等问题无法显示,同时方便期末对每次作业的汇总,提交 4.4、作业计分规则 每次作业的基准分满分为100分,各次作业会以特定比例换算到学期成绩。比如: 某次作业,满分100分,以权重25%换算到学期总成绩 小李此次作业得分85分,作业在deadline前提交,那么他本次作业会以85*100%*25% = 21.25换算到总成绩中 小张此次作业得分85分,并是在deadline后的两天内补交,那么他本次作业会以85*50%*25% = 10.625换算到总成绩中 小王在作业deadline两天后还未补交,作业提交已经关闭,此次作业得0分 ... 4.5、其它规则 作业抄袭:当助教发现两篇博客文字/图片/代码过分相似时,判定两篇博客都为抄袭,该次作业不得分,并倒扣该次作业占总成绩比重的分数; 伪造提交:虽然作业博客没有完成,但是先提交到作业占位置,判定为伪造提交,分数得0分; 若需要在课程群填写相关信息,**未能在deadline之前完成填写的,扣实际得分的50%**; 微信班级群如果发布相关通知也是作业要求部分,请及时查看群通知; 如对作业存在疑问,请在deadline之前三天在班级群提出; 若助教对作业要求有修改,会在群内公告,请务必查看并按新的要求完善作业; 🚨 特别提醒:去年有同学copy往期同学的思考成果,这是绝对不可取的行为!💢 旦被发现将会被倒扣100分!实践出真知,请同学们务必要独立思考,才能有所收获! 5.评分细则 【博客排版】(20%):是否在博客开头给出了本次作业的基本信息;是否给出了博客内容目录;是否采用markdown排版排版是否整齐,博客是否美观; 【思维导图和学习路线】(80%):思维导图是否覆盖所有要求的内容,整齐美观;路线图是否详尽具有可行性 6.附录教程 1、markdown教程-Gitcode 2、markdown教程-菜鸟教程 3、华为云CodeArts学习使用视频 4、Git入门-华为云 5、Git学习-优快云 6、Xmind绘制思维导图教程
09-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值