mongodb适用于经常要进行操作的应用系统,适应于读写性能要求极高的场景,Hadoop则侧重于对数据的统计分析的应用。 同时mongo的处理时延一般在10ms,而Hadoop一般进行离线分析,通过mapreduce分析,一般时延较长。但是当业务中存在大量的复杂逻辑操作,不要用mongodb数据库。
mongodb 优势
- 它将热数据存储于内存中,使得热数据的读写变得非常快,从而提高了整体的速度与效率。
- 高可扩展性,Mongodb的高可用与集群架构,通过物理机的增加和分片的增加,使mongodb扩展到很快的速度。
- 自身的failover机制,当主库遇到问题,副本将选举一个新主库替代主库。
- json的数据格式易于查询和学习
mongodb 特性
mongo是非关系型数据库,存储方式是虚拟内存 持久化,通过副本集,以及分片来实现高可用。
SQL术语/概念 | MongoDB术语/概念 |
---|---|
database | database |
table | collection |
row | document |
column | field |
index | index |
table join | 无 |
primary key | primary key |
connect
mongo 127.0.0.1/admin -u root -p ******
admin代表的是权限db,使用默认端口27017
CUID
mongo的数据库操作和mysql基本一致,将关键字对应后可基本安装mysql进行操作。
代码语言:javascript复制//create db
use DATABASE_NAME
// show database
show dbs
//insert
db.runoob.insert({"name":"菜鸟"})
//delete
db.dropDatabase()
//创建集合
代码语言:javascript复制use test
db.createCollection("runoob")
show collections
db.mycol2.insert({"name" : "菜鸟"})
db.mycol2.drop()
//创建文档
代码语言:javascript复制db.COLLECTION_NAME.insert(document)
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.col.find()
可以将数据定义到变量
document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
db.col.insert(document)
//更新文档
代码语言:javascript复制db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
//删除文档
代码语言:javascript复制db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
db.col.remove({'title':'MongoDB 教程'})
//查询文档
代码语言:javascript复制db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
代码语言:javascript复制db.col.find({key1:value1, key2:value2}).pretty()
db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
查询 title 包含"教"字的文档:
db.col.find({title:/教/})
查询 title 字段以"教"字开头的文档:
db.col.find({title:/^教/})
查询 titl e字段以"教"字结尾的文档:
db.col.find({title:/教$/})
如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:
db.col.find({"title" : {$type : 'string'}})
db.COLLECTION_NAME.find().limit(NUMBER)
//排序
代码语言:javascript复制1 为升序排列,而 -1 是用于降序排列。
db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
//索引
代码语言:javascript复制1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可
db.collection.createIndex(keys, options)
db.values.createIndex({open: 1, close: 1}, {background: true})
创建索引时加 background:true 的选项,让创建工作在后台执行
//聚合
代码语言:javascript复制db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
select by_user, count(*) from mycol group by by_user
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])