MongoDB学习小记
来源:互联网 发布:c语言 神奇的幻方 编辑:程序博客网 时间:2024/05/11 21:38
MongoDB 学习笔记
因为要处理一些数据,这两天学习了一下MongoDB,在此记录下一些对MongoDB粗浅的认识。
直观认识
MongoDB是NoSQL(Not Only SQL)数据库之一,之前用过Redis也属于NoSQL,不过两者的应用场景很不相同。Redis是内存型k-v数据库,作为缓存可以实现高效的存取,但是做不了复杂的查询与分析。MongoDB是持久化存储的,同时支持aggregate 、 map reduce操作,也就支持了复杂的查询,本身就被设计为在一些场景可以替代RDBMS的。
MongoDB又叫做文档型数据库,具体来说就是一个database里面可以有若干个collections,每个collection相当于RDBMS里的一张表。每个collection里又可以存储若干文档document,每个document相当于RDBMS一张表里的一行。文档的结构与JSON非常相似,这个格式在这里被称为BSON。
MongoDB给我最直观的感觉就是自由,这一点与RDBMS很不相同。比如在用MySQL建一张表的时候,所需要的字段以及字段类型都要事先定义好,里面存储的每一条记录都要按照这个格式,这很严谨,在事物操作的场景很有必要。但使用MongoDB时并不需要严格定义一个collection里面文档的结构,里面所存储的每个文档结构甚至可以不相同(但通常还是会有一个统一的格式和主题)。这在存储爬虫数据的时候很管用,在执行一个抓取任务的时候,事先不一定就能完全确定需要的字段,需要增添字段的时候,MongoDB因为没有定义好的表结构,所以添加特别容易。
还有在设计数据仓库的时候,也可以先在MongoDB里面试验,确定定义的主题事实表与相应的维表可以满足需求的时候,再用Hive建表。
知识记录
MongoDB有一个Shell,支持很多的方法。在MongoDB的网站上列的比较详细。
https://docs.mongodb.org/manual/reference/method/
可以直接在这个Shell里面操作数据库,也可以令Mongo Shell来执行JavaScript脚本,这样就可以很方便的执行定时任务了。
SQL的增删改查在上述Shell方法里面都能找到相应的对应,比如查询 db.collection.find({query},{project})
第一个query指的是查询的条件,对应于SQL里的where,第二个project是选取需要的字段,如果没有就是保留符合条件的文档的所有字段,如: ({"Lang":"Java"}, {Lang:1, BookName:1})
就相当于 select Lang, BookName from collection where Lang='Java'
MongoDB里查询返回的结果是一个称为Cursor的对象,在Shell里面直接执行db.collection.find()
会将结果直接print到屏幕上。如果想要持有这些结果再做一些处理的话,要写 var c = db.collection.find()
,然后可以把cursor看成一个迭代器
while (c.hasNext()) { printjson(c.next())}
让我觉得比较有意思的是Aggregation pipeline,就像linux下的pipeline一样,可以把一个操作的输出当做另一个操作的输入。如果用SQL的话就要嵌套子查询,看去不是很直观,而MongDB的pipeline让一系列的查询操作看起来特别直观,如
db.collection.aggregate([ {$match}, {$group}, {$sort}, {$limit}, {$project}])
这个操作传递了一个array[]给aggregate方法,而这个array由一系列的操作元素构成(没有写完整,只是一个形式),首先通过$match从collection里面筛选出符合条件的document,然后再用group做聚合计算,group就相当于SQL里面的group by,并对聚合后的结果排序,sort相当于order by,limit就是SQL里的limit,project就是选取结果里的字段,或是重命名,生成一些字段。
适用于pipeline的操作还有 $redact, $skip, $unwind, $sample, $geoNear, $lookup, $out
。功能很强大。
MongoDB还支持map reduce,map与reduce的函数都通过JavaScript编写(指的是Mongo Shell的情况,如果用了其他语言的driver当然不限于此)。map和reduce更加强了MongoDB处理数据的能力,但是效率会比aggregation pipeline略低,也就是说能用aggregate方法,就尽量不用mapReduce方法。
- MongoDB学习小记
- 学习笔录之MongoDB小记
- Java操作mongodb小记
- MongoDb nodejs 虚拟机小记
- 学习小记
- 学习小记
- 学习小记
- 学习小记
- MongoDB小记-detected unclear shutdown
- 【小记】深度学习学习
- 【mongoDB】mongoDB学习日记
- [MongoDB]MongoDB学习
- 对于bson和mongoDB的小记
- Mongodb 学习
- MongoDB学习
- mongoDB学习
- MongoDB学习
- mongodb 学习
- Linux命令简写和全称
- css - SASS/SCSS 基本教程
- 软件设计模式——解释器模式(Interpreter)
- 基于贪心算法的几类区间覆盖问题
- SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件
- MongoDB学习小记
- C经典 逆序打印一维数组
- 基于MT7688模块的开发笔记4——编译Linux系统和Uboot
- leetcode——132—— Palindrome Partitioning II
- 【LeetCode】Reverse Vowels of a String 解题报告
- Python多线程简易版 - 线程池threadpool
- Java基础
- ARM处理器的快速上下文切换技术FCSE
- Python中 BeautifulSoup模块的安装