MongoDB是目前工作中经常使用到的NoSQL数据库。
本博客只记录相关理论知识和技巧,涉及到实践的部分都会单开Blog来记录实践过程。
-------------------------------------------------------------------------------
体系结构:
一般一个MongoDB Server包含一个实例和多个数据库,也可以多个实例和多个数据库。
MongoDB默认数据目录是/data/db,它存储所有mongodb的数据文件。
每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加越来越多。
MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。
数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。
MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约 628 字节,也即整个数据库的命名空间的上限约为24000。
如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。
要建立更多的集合的话,MongoDB 也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为 2G。
每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。
需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。
MongoDB默认存储数据目录为/data/db,默认端口为27017,默认HTTP端口为28017。
MongoDB一般参数:
Journal -- 开启日志,通过保存操作日志来降低单机故障恢复的时间。
Syncdelay -- 系统同步刷新磁盘的时间,单位为秒,默认60秒。
Repairpath – 执行repair时的临时目录,在如果没有开启journal,异常down机后重启,必须执行repair操作。
执行mongod –help可以看见对大多数参数的解释。
停止mongodb:
(1)Ctrl + C
(2)>mongo –port 20813
>use admin
>db.shutdownserver();
(3)kill -2 PID
不要预先插入集合,在第一次插入的时候会自动创建。
使用find查询时,如果数据过多则不会全部显示,使用it命令继续迭代输出。
>it (迭代输出)
MongoDB每个文档都有一个默认的主键_id,这个主键名称是固定的。可以是MongoDB支持的任何数据类型,默认是ObjectId。但同一个集合中_id类型必须唯一,且不能插入值相同的数据。
创建数据库
use dbname
这样就创建了一个数据库。如果什么都不操作离开的话,这个库就会被系统删除。
show dbs
//查看数据库
show
collections //查看集合
基本操作
db.collection.update({a:99},{$set:{a:2}}) //update
db.collection.remove({a:2}) //remove {a:2}
db.collection.remove() //remove all
db.collection.find()
db.collection.find({name:”mongo”})
db.collection.findOne({name:”mongo”})
db.collection.find({a:{$gt:3}}) // a > 3
db.collection.find({a:{$lt:5}}) // a < 5
db.collection.find({a:{$gte:3}}) // a >= 3
db.collection.find({a:{$lte:5}}) // a <= 5
db.collection.find({a:{$gte:3,$lte:5}}) // 3 <= a <= 5
db.collection.find({a:{$all:[6,8]}}) //不同于$in,$in满足其中一个值,$all必须满足所有值。
db.collection.find({a:{$exists:true}}) //存在a字段的记录
db.collection.find({a:null}}) //a字段为null或者不存在a字段都会查询出来
db.collection.find({a:{$in:[null],$exists:true}}}) //只查询出a为null的记录
db.collection.find({age:{$mod:[3,1]}}) //查询出age模3等于1的记录
db.collection.find({age:{$ne:7}}) // age<>7
db.collection.find({age:{$in:[7,8]}}) //显示age为7或8的记录
db.collection.find({age:{$nin:[7,8]}}) //查询age值在7,8外的记录
db.collection.find({name:’Sue’},{$pull:{‘languages’:’scala’}}); //移除数组中的项
db.collection.find({name:’Sue’},{$push:{‘languages’:’ruby’}}); //加入数组中的项
db.collection.find().limit(5); //返回最前面的5条
db.collection.find().limit(0); //返回所有记录
db.collection.find().skip(2); //返回时跳过前2条
db.collection.find().sort({a:1}) //排序:1升序,-1降序
db.collection.count(); //返回所有记录数
db.collection.find().limit(5).count(); //返回所有记录数
db.collection.find().limit(5).count(true); //返回限制后的记录数
db.testcoll.find({},{col:true}) //只查询col列
db.testcoll.find({‘_id’:ObjectId(‘1234567890’)}); //按主键查询
查询嵌入的document
db.people.find({"name"
: {"first" : "Joe", "last" :
"Schmoe"}})
要加一个middle name,这个查询就不行了,这种查询必须匹配整个嵌入的document,而且key是有顺序.
db.people.find({"name.first" :
"Joe"})
这样可以直接查询嵌入文档中的key。因此document中的key不能包含”.”。
更新嵌套文档
db.testcoll.update({“name”:
{"first" : "Joe"},{$set: {"first" : "Joe123"}}}) //更新嵌套文档
或
db.testcoll.update({'b.c':'123'},{$set:{'b.c':'456'}})
capped collection
capped collection有固定大小,以LRU规则自动维护插入顺序。
在创建时要预先指定大小,空间用完,新添加的对象会替代最旧的对象。
不允许删除,但可以调用drop()删除集合中的所有行,但drop后需要显示的重建集合。32位机上capped collection的最大值482.5M,64位只受系统文件大小的限制。
常见用途:
MongoDB中日志机制的首选:MongoDB没有使用日志文件,而是把日志存储在数据库中。
在一个没有索引的capped collection中插入对象的速度与在文件系统中记录日志的速度相当。
Cache:需要在capped collection上建一个索引,因为读比写多。
Auto Archiving:利用capped collection的age-out特性,省去了写cron做人工归档的工作。
如果capped collection的写比读多,最好不要在上面建索引,否则速度从log speed降到database speed。
使用nature ording可以有效地检索最近插入的元素,因为capped collection能保证自然排序就是插入时的顺序,类似于log文件上的tail操作。
db.createCollection(“testcoll”,{capped:true,size:100000,max:100,autoIndexId:false});
capped – 是否为capped collection。
size – 占用空间大小(bytes)。
max – 最大的document记录数,max=1 无限制。
autoIndexId -- 是否在_id列上自动创建索引。
db.testcoll.validate(); //查看一个collection使用空间
默认对一般collection建立索引,但是不对capped collection建立索引。
GridFS
使用两个表来存储:
files包含元数据对象,chunks包含其它一些相关信息的二进制块。为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认情况下前缀是fs,所以任何默认的GridFS存储包括命名空间fs.files和fs.chunks。
./mongofiles put testfile //存储文件
./mongofiles list //列出存储的文件
show collections //查看集合存储文件
db.fs.files.find() //查看fs.files中的内容
结果中:
Filename -- 文件名
Chunksize – chunks分块大小
uploadDate – 分块时间
md5 – 文件的md5值
length –文件大小字节
fs.files中存储的是元数据信息
db.fs.chunks.find() //查看fs.chunks中的内容
结果中:n代表chunks的序号
fs.chunks中存储的是文件实际内容数据
./mongofiles get testfile //取出文件
md5sum testfile //md5校验 – 跟gridfs中文件存储的md5相同
为gridfs的chunks建立索引:
db.fs.chunks.ensureIndex({files_id:1,n:1},{unique:true});
一个块就可以用他的files_id和n值进行检索.
即查询块:
db.fs.chunks.findOne({files_id:myFileID,n:0});
时就会用到索引提高查询速度。
命令行操作
使用eval执行语句:
./mongo testcoll --eval
"printjson(db.testcoll.count())
返回testcoll集合总记录数
执行指定文件中的内容:
./mongo --quiet t1_count.js
执行js脚本内容,--quiet参数去除登录信息,使结果更清晰.
进程控制
查看活动进程:
db.currentOp()
响应:
Opid – 操作进程号
Op – 操作类型
Ns – 命名空间
Query – 如果操作类型是查询,显示查询内容
LockType – 读锁还是写锁
结束进程:
db.killOp(opid);
不要kill内部发起的操作,如replica set发起的sync操作。
索引
索引信息被保存在system.indexes中,默认总是为_id创建索引。
db.testcoll.ensureIndex({age:1}); //在age上创建索引,1升序,-1降序
db.testcoll.ensureIndex({age:1},{backgroud:true});
//当已有大量数据时,在后台创建索引。
db.testcoll.getIndexes(); //查看索引
_id索引是自动创建的索引,这个索引是不能删除的。
文档索引
索引可以是任何类型的字段甚至文档。
db.testcoll.insert({name:123,addr{city:Beijing,state:BJ}})
建立索引:db.ensureIndex({addr:1})
查询时必须按照建立索引的文档顺序查询,才能用到索引:
db.testcoll.find({addr{city:Beijing,state:BJ}})
下面的不会用到索引:
db.testcoll.find({addr{state:BJ, city:Beijing}})
组合索引
db.ensureIndex({‘addr.city’:1,’addr.state’:-1})
查询时:只按{addr.city}查询或排序会用到索引,或者按{addr.city,addr.state}顺序查询或排序也会用到索引。
唯一索引
db.testcoll.ensureIndex({firstname:1,lastname:1},{unique:true})
//创建
如果数据库中已有重复记录则无法创建唯一索引。
查询时强制使用索引
db.testcoll.ensureIndex({name:1,age:1}) //建立组合索引
db.testcoll.find({age:{$lt>30}}) //查询时不会使用到索引
db.testcoll.find({age:{$lt>30}}).hint({name:1,age:1}) //查询时强制使用索引,必须是已创建的索引。
删除索引
db.testcoll.dropIndexes() //删除集合中所有索引
db.testcoll.dropIndexes({firstname:1}) //删除集合中某个索引
查看系统如何处理查询请求
db.testcoll.find().explain()
优化器Profile 与
性能优化(略)
性能监控
Mongosniff:从底层监控到底哪些指令发送给了MongoDB去执行。
Mongostat:查看某组运行中mongodb实例的统计信息。
db.serverStatus() :查看实例运行状态的命令。
db.stats():查看数据库状态信息。
分享到:
相关推荐
MongoDB是一款开源、分布式文档数据库系统,以其高性能、高可用性、易扩展性和灵活的数据模型而闻名...通过安装和配置"mongodb-win32-x86_64-2012plus-4.2.8-signed.msi",你可以在Windows环境中开始你的MongoDB之旅。
MongoDB是一种流行的开源文档型数据库,常用于处理和存储JSON格式的数据。在Windows环境下配置...这仅仅是MongoDB之旅的开始,还有更多高级特性和最佳实践等待你去探索。祝你在学习MongoDB的过程中取得更大的进步!
MongoDB,NOsql中的经典,开始学习MongoDB之旅吧
MongoDB是一款开源、分布式、高性能的NoSQL数据库,它的出现主要解决了传统关系型数据库在处理大规模数据时面临的挑战。在本教程中,我们将详细介绍MongoDB的安装过程,并提供...现在,你可以开始你的MongoDB之旅了!
### MongoDB安装与基础操作详尽指南 #### 一、前言 MongoDB是一款开源的、高性能的、基于分布式...这是你踏上MongoDB之旅的第一步,希望你能继续深入学习,充分利用MongoDB的优势,为你的数据管理和应用开发带来便利。
《Python库pymongo-3.10.0:连接MongoDB的数据利器》 Python作为一门强大且广泛...在安装“pymongo-3.10.0-cp27-cp27mu-manylinux1_x86_64.whl”这个压缩包后,Python 2.7的Linux用户就能立即开始他们的MongoDB之旅。
MongoDB是一种流行的开源、分布式文档型数据库,常用于构建高...希望本教程对你的MongoDB之旅有所帮助,如果你有任何问题或需要进一步的信息,随时提问。感谢你对我们网站的支持,如果你觉得有用,请分享和注明出处。
MongoDB是一个分布式文档型数据库,它以其灵活性、可扩展性和高性能而受到开发者的青睐。作为一个非关系型数据库(NoSQL),MongoDB不使用传统的表和列结构,而是使用JSON...这将为你的MongoDB学习之旅打下坚实的基础。
“开发者之旅”是一系列教程和案例研究,旨在引导开发者深入了解MongoDB的应用场景和技术优势,从初级到高级逐步提升技能。 ### **36. 更新(Updates)** 这部分内容记录了MongoDB的更新历史,包括新功能的引入、...
MongoDB是一款流行的开源、分布式文档型数据库,以其灵活性、高性能和可扩展性而备受青睐。...使用像mongodbmanagerfree_inst.exe这样的安装程序,用户可以轻松下载并安装这款工具,开始他们的MongoDB管理之旅。
MongoDB 是一个流行的开源、分布式文档数据库系统,以其高性能、高可用性和易扩展性而闻名。这个名为 "mongodb-macos-x86_64-...按照官方文档的指示,您可以轻松地安装、配置并启动 MongoDB 服务,开始您的数据库之旅。
标题中的"navicat121_mongodb_cs_x64+navicat121_mongodb_cs_x86.rar"指示了...这个压缩包的文件名列表表明了用户将能够下载并安装适合他们操作系统版本的Navicat for MongoDB客户端,从而开始他们的MongoDB管理之旅。
MongoDB是一种流行的开源、分布式文档型数据库,常用于处理大量数据。在Windows 7操作系统上管理MongoDB数据库时,一个直观且高效的可视化...通过下载并安装提供的exe文件,用户可以快速开始他们的MongoDB可视化之旅。
安装完成后,你可以通过MongoDB Shell连接到数据库,开始你的学习之旅。 在学习MongoDB时,你需要掌握基本的CRUD操作、数据模型设计、索引使用、复制集的建立和维护、分片集群的搭建以及性能调优策略等。理解NoSQL...
相比之下,MongoDB 使用的是集合(Collections)和文档(Documents)的概念。这意味着在 MongoDB 中,每个文档都可以有不同的字段和结构,这种灵活性非常适合处理非结构化数据。 例如,在关系型数据库中,为了存储...
需要学习mongodb,或者要对mongodb进行演讲的朋友欢迎下载。
MongoDB是一种流行的开源、分布式数据库系统,以JSON文档存储数据,具有高性能、高可用性和可扩展性。在本文中,我们将深入探讨MongoDB及其管理工具Robo 3T...只需简单解压并运行,即可开启MongoDB的数据探索之旅。
MongoDB是一款分布式文档型数据库,广泛应用于Web开发、数据分析、云计算等多个领域。它以其灵活性、高性能和易用性而受到开发者们...通过理解这些知识,你将能够顺利地搭建MongoDB环境并开始你的数据存储和处理之旅。
安装完成后,通过启动图标或开始菜单快捷方式打开应用,开始您的MongoDB可视化管理之旅。 总的来说,MongoDBManagerFree作为一款免费的MongoDB可视化工具,为开发人员、数据库管理员以及数据分析人员提供了极大的...