天天看点

MongoDB学习小结

(本文来源于我的工作笔记,是刚接触Mongo时整理的)

1,mongodb是面向文档类型的层次型数据库,documents -> collections -> databases -> mongodb;

2,在需要存储大数据量的情况下使用;

3,操作的语言是js,里面的对象是js生成的,例如mongo,collection,而里面的操作例如:find,sort,insert,update,remove和$等都是用js解析的;

4,mongodb本身可以说就是一个js解析器;

5,mongodb是一个免安装的服务,和redis一样,支持在命令行下运行,也支持后台单进程运行,只需要使用-fork参数;

6,mongodb运行的命令是mongod -dbpath mypath,其中mypath是要指定的数据库的目录;

7,mongodb的bin目录下还有一些常用工具,mongod是服务程序,mongo则是客户端连接工具,mongostat是实时监控工具;

8,mongodb的性能测试报告中指出,mongodb的批量导入与批量导出的性能很高,而其并发处理的能力只是一般,若并发数较大,则命中率会有所降低;

9,我目前使用java连接mongodb的方式有两种:mongo-java-driver和spring-data-mongodb,都不难使用,后者支持spring;

10,mongodb里默认有个主键叫_id,若插入的数据没有指定一个具体的_id,mongodb则会自动生成一个ObjectId,由于mongodb的设计初衷是分布式,所以主键没有自增的功能;

11,mongodb中插入操作有时会变成更新操作,当插入的_id和已经存在的_id相同时;

12,mongodb中判断两个document是否相同是根据_id的;

13,mongodb的分布式是由于支持分片(shard)功能,而其高性能的批量导入与导出是基础;

14,分片就是取其某一子集;--------------MongoDB宏观-------------

3,操作的语言是js,里面的对象是js生成的,例如mongo,collection,而里面的操作例如:find,sort,insert,update,remove,save和$等都是用js解析的;

11,mongodb中save操作有时会变成updata操作,当save的_id和已经存在的_id相同时;

14,分片就是取其某一子集;

--------------查询与性能---------------

15,查询区分大小写(大小写敏感),虽然可以使用正则表达式,但那样会降低性能;

16,单个文件的大小是有限制的(旧版是4M,新版是16M);

17,高速的写入和更新的原因是没有明确的错误通知(也就是不安全写入),若需要安全写入可用getLastError with 'j',0.1s/次保存到日志;

18,(原文引用)MongoDB使用内存映射文件并且每60秒向磁盘输出一次通知,这就意味着最大程度上你可能丢失60秒加上向硬盘输出通知这段时间内所有的数据。为了避免数据丢失,MongoDB从2.0版本起就添加了Journaling(默认情况下开启)。当然Journaling会轻微的影响到性能,大约5%。但是对于多数人来说额外带来的安全性肯定是物有所值的。

-------------查询与索引------------------

19,最好要创建查询中用到的键的索引,不然MongoDB会做整个表的扫描,那样会影响查询性能,索引的创建方式是db[.集合名].ensureIndex({"键名" : 1},{"background" : true});

20,某个键的索引当且仅当用该键查询时才有用,对于用其他键查询无用;

21,要尽可能少的创建索引,因为插入,更新和删除都会因为索引而带来额外的开销,同样影响到性能;

22,使用{"background" : true}使创建索引的过程在后台完成,这样数据库不会阻塞建立索引时的所有请求;

23,删除索引(system.indexes中会有所有索引名),db.runCommand({"dropIndexes" : "集合名", "index" : "索引名"})

-----------------MongoDB聚合--------------

24,db.collection.count()返回集合中的文档数量;

25,db.runCommand({"distinct" : "集合名", "key" : "键名"}),用来找出指定键的所有不同值;

-----------------MongoDB操作--------------

26,db.collection.save()与db.collection.insert()的区别:insert有判断主键(_id)是否存在,若存在则不做任何操作,而save则不做判断,不存在则insert,存在则update;

27,db.collection.update()默认只更新一条数据,若要更新多条,要加{"multi" : true};

28,后台入口:http://host:http:28017/,需要启动时加-rest参数支持;

29,MongoDB通过db.eval(javascript代码)在服务器端执行javascript代码;