一、前言
mongodb是目前比较流行的一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库(NoSQL)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。mongoDB中将一条数据存储为一个文档(document),数据结构由键值(key-value)对组成。 其中文档类似于我们平常编程中用到的JSON对象。 文档中的字段值可以包含其他文档,数组及文档数组。mongoDB中相关概念与我们熟悉的SQL概念对比如下:
MongoDB术语/概念 | 说明 | 对比SQL术语/概念 |
---|---|---|
database | 数据库 | database |
collection | 集合 | table |
document | 文档 | row |
field | 字段 | column |
index | index | 索引 |
primary key | 主键 MongoDB自动将_id字段设置为主键 | primary key |
二、数据库常用命令
show dbs;
:查看数据库
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
use q1mi;
:切换到指定数据库,如果不存在该数据库就创建。
> use q1mi;
switched to db q1mi
db;
:显示当前所在数据库。
> db;
q1mi
db.dropDatabase()
:删除当前数据库
> db.dropDatabase();
{ "ok" : 1 }
三、数据集常用命令
db.createCollection(name,options)
:创建数据集
- name:数据集名称
- options:可选参数,指定内存大小和索引。
> db.createCollection("student");
{ "ok" : 1 }
show collections;
:查看当前数据库中所有集合。
> show collections;
student
db.student.drop()
:删除指定数据集
> db.student.drop()
true
四、文档常用命令
插入一条文档:
> db.student.insertOne({name:"小王子",age:18});
{
"acknowledged" : true,
"insertedId" : ObjectId("5db149e904b33457f8c02509")
}
插入多条文档:
> db.student.insertMany([
... {name:"张三",age:20},
... {name:"李四",age:25}
... ]);
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5db14c4704b33457f8c0250a"),
ObjectId("5db14c4704b33457f8c0250b")
]
}
查询所有文档:
> db.student.find();
{ "_id" : ObjectId("5db149e904b33457f8c02509"), "name" : "小王子", "age" : 18 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250a"), "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250b"), "name" : "李四", "age" : 25 }
查询age>20岁的文档:
> db.student.find(
... {age:{$gt:20}}
... )
{ "_id" : ObjectId("5db14c4704b33457f8c0250b"), "name" : "李四", "age" : 25 }
更新文档:
> db.student.update(
... {name:"小王子"},
... {name:"老王子",age:98}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : ObjectId("5db149e904b33457f8c02509"), "name" : "老王子", "age" : 98 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250a"), "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250b"), "name" : "李四", "age" : 25 }
删除文档:
> db.student.deleteOne({name:"李四"});
{ "acknowledged" : true, "deletedCount" : 1 }
> db.student.find()
{ "_id" : ObjectId("5db149e904b33457f8c02509"), "name" : "老王子", "age" : 98 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250a"), "name" : "张三", "age" : 20 }
五、mongodb读写流程
mongodb分片集群是在副本集的基础上弄出来的,意在解决水平扩展的问题。,下图展现的就是一个高可用的mongodb分片集群。整个集群分为四大部分,上层的客户端(其实也可以是业务代码)、Mongos(路由)、Mongod(作为参数存储的)、replica(副本集)。
- 副(复)本集(replica set)中存储的数据是相同的,为的是容灾。
- 分片(Shard Server)为了数据扩展,按照片键进行节点划分,数据根据片键存储到对应的服务器上。
- Mongos是路由。
1、向MongoDB写入数据
写数据时,先向配置中心注册,配置中心会返回相对应的key值
2、从MongoDB读取数据
六、mongodb集群及高可用
这部分内容参见我的另一篇博客:数据库高可用集群构建模式之——mongodb篇