MongoDB
数据操作的“三高”需求有哪三个
• High performance - 对数据库高并发读写的需求。
• Huge Storage - 对海量数据的高效率存储和访问的需求。
• High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。
MongoDB的特点/使用环境
- 数据量大
- 写入操作频繁(读写都很频繁)
- 价值较低的数据,对事务性要求不高
- 应用不需要事务及复杂 join 支持
- 新应用,需求会变,数据模型无法确定,想快速迭代开发
- 应用需要2000-3000以上的读写QPS(更高也可以)
- 应用需要TB甚至 PB 级别数据存储
- 应用发展迅速,需要能快速水平扩展
- 应用要求存储的数据不丢失
- 应用需要99.999%高可用
- 应用需要大量的地理位置查询、文本查询
MongoDB相对于MySQL,可以以更低的成本解决问题
MongoDB的优点:
弱一致性(最终一致):
更能保证用户的访问速度
文档结构的存储方式,能够更便捷的获取数据:
对于一个层级式的数据结构来说,要将很多的数据使用扁平式的、表状的结构来保存数据的话,这不管是在查询还是获取数据时都会很困难)
第三方支持丰富:
这也是MongoDB跟其它的NoSQL具有的相同优势,网络上的很多NoSQL开源数据库完全属于社区型的,没有官方支持,给使用者带来了很大的风险性能优越:
在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能可以,同时它的写入性能也很厉害,可以写入百万级别的数据
MongoDB的缺点:
MongoDB不支持事务操作
所以事务要求严格的系统,比如银行系统就不能用它。MongoDB占用空间过大
(1)空间的预分配:
当MongoDB的空间不足时它就会申请生成一大块硬盘空间,而且申请的量都是有64M、128M、256M来增加直到2G为单个文件的较大体积,并且随着数量叠增,可以在数据目录下看到整块生成而且不断递增的文件。(2)删除记录不释放空间:
这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。(开发和IT运营要注意)MongoDB没有MySQL那样成熟的维护工具
MongoDB常用语句
连接Mongo数据库,并设置数据存储地址
mongod.exe --dbpath "d:\software\MongoDB\Server\3.0\data"
#--------------------------数据库--------------------------#
查看所有的数据库
show dbs
删除当前使用的数据库
db.dropDatabase()
使用这个数据库(只有插入数据后完成创建数据库)
use dbt
查看当前使用的数据库
db
db.getName()
查看当前数据库状态
db.stats()
修复当前数据库
db.repairDatabase()
从一个数据库复制到另一个数据库
db.copyDatabase("mydb", "temp", "127.0.0.1");
#--------------------------集合--------------------------#
查看当前数据库下所有的集合
show collections
show tables
创建名称为coll集合
db.createCollection('coll')
db.createCollection("coll2", {capped:true, autoIndexId:true, size:6142800, max:10000}) # 可选参数
查看当前集合状态
db.coll.stats()
删除名称为coll集合
db.coll.drop()
#--------------------------集合数据--------------------------#
插入空数据并且直接创建名称为coll集合
db.coll.insert({})
插入一个或多个数据
db.coll.insert({name:'tom', age:22})
db.coll.insert([{name:'adam', age:10},{name:'john', age:23}])
添加数据(save方法可以修改相同id的数据)
db.coll.save({name:'allen'})
删除一个或所有的数据
db.coll.remove({name:'tom'})
db.coll.remove({})
删除符合条件的数据中的第一条
db.coll.remove({name:'tom'}, 1)
更改数据
db.coll.update({name:'tom', age:22}, {$set:{name:'tom', age:222}})
查看数据
db.coll.find()
查看一条数据
db.coll.findOne()
db.coll.find({}, {name:1, '_id':0}) # 1表示显示,0表示不显示(find默认显示_id)
格式化显示数据,使数据更加清晰明了
db.coll.find().pretty()
使用and,or查看数据
db.coll.find({name:'tom', age:22}) # 等同and使用
db.coll.find({$or:[{name:'tom'}, {age:21}]}) # or使用
操作符大于,小于,等于,不等于,大于不等于,小于不等于
db.coll.find({age: {$gt: 22}}) # 大于
db.coll.find({age: {$lt: 22}}) # 大于
db.coll.find({age: 22}) # 等于
db.coll.find({age: {$ne: 22}}) # 不等于
db.coll.find({age: {$gte: 22}}) # 大于等于
db.coll.find({age: {$lte: 22}}) # 小于等于
显示从skip之后limit个
db.coll.find().limit(2).skip(1)
#--------------------------用户--------------------------#
3.x之后版本添加用户
use admin
db.createUser({user:'nu', pwd:'nu', roles:[{role:'readWrite',db:'admin'}]})
用户认证
db.auth("nu", "nu");
显示当前所有用户
show users;
db.system.users.find()
3.x版本删除用户
db.removeUser('nu') # 不推荐使用,已经废弃
db.dropUser("nu");
当前db版本
db.version();
当前db的链接机器地址和端口
db.getMongo();
备份到备份目录
mongodump
从备份目录恢复备份语句。
mongorestore