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方法。

0 0
原创粉丝点击