MongoDB简记
*MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。*
- NoSQL = Not Only SQL 即不仅仅是SQL,非关系型数据库,用于超大规模数据的存储。
- 关系型数据库遵循ACID规则:原子性,一致性,独立性,持久性
- 分布式计算系统不可能同时满足三点:C一致性,A可用性,P分隔容忍。最多同时较好的满足两个,因此存在三大类的NoSQL数据库类型:
- CA- 单点集群
- CP-
- AP-
- NoSQL 数据库分类:
- 列存储:HBase,Cassandra,Hypertable
- 文档存储:MongoDB,CouchDB
- key-value存储:
- Redis,MemcacheDB,Tokyo Cabinet,Tyrant
Berkeley DB - 图存储:Neo4J,FlockDB
- 对象存储:db4o,Versant
- xml数据库:Berkeley DB XML,BaseX
- MongoDB将数据存储在一个文档,数据结构为键值key=>value对组成,类似于json对象
- 基本概念:
- database 数据库
- collection 数据库表/集合
- document 数据库记录/文档
- field 数据库字段/域
- index 索引
- 不支持table joins
- primary key 主键 自动将_id字段设置为主键
- MongoDB-连接
mongodb://username:password@hostnamedbname
- 创建数据库:
use dbname
不存在则创建存在切换到制定数据库show dbs
查看所有数据库- 默认数据库test,如果没有创建新的数据库,集合默认存放在其中
- 删除数据库:
db.dropDatabase()
:删除当前数据库- 删除先use再删除
- 删除集合为:
db.collection.drop()
- 插入文档:
- insert()或则save()指定了_id字段为更新数据,否则差不多是插入,语法:
db.COLLECTION.insert(document)
- insert()或则save()指定了_id字段为更新数据,否则差不多是插入,语法:
- 更新文档:
- update():
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
- update():
- 删除文档:
db.collection.remove(
<query>,
<justOne>
)
- 查询文档
db.col.find().pretty()
- pretty()格式化形式显示所有文档
- 等于
{<key>:<value>}
- 小于
{<key>:{$lt:<value>}}
- 小于等于
{<key>:{$lte:<value>}}
- 大于
{<key>:{$gt:<value>}}
- 大于等于
{<key>:{$gte:<value>}}
- 不等于
{<key>:{$ne:<value>}}
- AND条件 要用逗号分隔每个key
- OR条件 使用 $or
- $type 操作符 基于BSON类型来检索集合中匹配的数据类型并返回结果
- 类型 数字 备注
- Double 1
- String 2
- Object 3
- Array 4
- Binary data 5
- Undefined 6 已废弃。
- Object id 7
- Boolean 8
- Date 9
- Null 10
- Regular Expression 11
- JavaScript 13
- Symbol 14
- JavaScript (with scope) 15
- 32-bit integer 16
- Timestamp 17
- 64-bit integer 18
- Min key 255 Query with -1.
- Max key 127
- Limit与Skip方法
- limit()读取指定数量的数据记录:
db.collection.find().limit(number)
- skip()跳过指定数量的数据:
db.collection.find().limit(number).skip(number)
- limit()读取指定数量的数据记录:
- 排序 sort()
db.collection.find().sort({KEY:1})
- 1 为升序 -1 为降序
- 索引
- 创建索引:
db.collection.ensureIndex({KEY:1})
- 1指定按升序创建索引,-1降序
- 创建索引:
- 聚合
- 用户处理数据如统计求平均值求和
db.collection.aggregate(AGGREGATE_OPERATION)
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "w3cschool.cc",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}- group, g r o u p , sum, avg, a v g , min, max, m a x , push(在结果文档中插入值到一个数组中), addToSet(在结果文档中插入值到一个数组中,但不创建副本), a d d T o S e t ( 在 结 果 文 档 中 插 入 值 到 一 个 数 组 中 , 但 不 创 建 副 本 ) , first,$last
- 管道 ==> 将当前命令的输出结果作为下一个命令的参数
- $project:修改输入文档的结构
- $match:过滤数据
- $limit:限制返回文档数
- $skip
- $unwind:拆分文档中某一个数组字段为多条
- $group:分组,用于统计结果
- $sort: 排序
- $genNear:输出接近某一个地理位置的有序文档
- 复制(副本集)
- 用于同步数据在多个服务器的过程
- 主从节点,主节点负责处理客户端请求,其余节点负责复制主节点的数据。
- 定期轮询
- 语法:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
-添加副本集成员:rs.add(HOST_NAME:PORT)
- 分片
- 为满足数据量大量增长的需求
- 三个主要组件:
- shard:存储实际的数据块
- config Server 存储整个ClusterMetadata,包括chunk信息
- Query Rouers:前端路由,客户端接入口,使整个集群像是一个单一数据库