理论
定义
一个基于分布式文件存储的数据库。由C++语言编写。
特点
- 存储形式为BSON(Binary Serialized Document Format)
- 面向集合存储,易存储对象类型的数据。
- 模式自由。
- 支持动态查询。
- 支持完全索引,包含内部对象。
- 支持查询
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- 文件存储格式为BSON(一种JSON的扩展)。
- 可通过网络访问。
- 不支持表连接
- 文档中的键/值对是有序的
- 区分类型和大小写
适用场景
在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起
网站数据,缓存, 大尺寸、低价值的数据,高伸缩性的场景,用于对象及JSON 数据的存储
Mongo不适用的场景如下:
- 要求高度事务性的系统。
- 传统的商业智能应用。
- 复杂的跨文档(表)级联查询。
元数据
集合命名空间 描述
dbname.system.namespaces 列出所有名字空间。
dbname.system.indexes 列出所有索`引。
dbname.system.profile 包含数据库概要(profile)信息。
dbname.system.users 列出所有可访问数据库的用户。
dbname.local.sources 包含复制对端(slave)的服务器信息和状态。
安装
- windows,安装到服务
- linux,网页版访问,–rest
数据类型
String, Integer, Boolean, Double, Min/Max keys, Arrays, Timestamp, Object, Null, Symbol, Date, Object ID, Binary Data, Code, Regular expression,
连接
mongodb:username:password@hostname/dbname
命令
- use
- show dbs
- db.col.insert(doc)
- db,查看当前数据库名
- db.dropDatabase()
- db.col.drop()
- db.col.find()
- db.col.save(doc)
- db.col.update( criteria, objNew, upsert, multi ),db.col.update( 查询条件, update的对象和一些更新的操作符, 不存在是否插入, 是否更新多条记录 )
-
db.col.remove(
, { justOne: , writeConcern: } ) -
db.col.find().pretty()
- db.col.findOne()
- {key:{比较符号:value},:,lt,gt,gte,lte,ne
- $or:[{},{}]
- db.col.find().limit(NUMBER)
- db.col.find().skip(NUMBER)
- db.col.find().sort({KEY:1})
- db.col.ensureIndex({KEY:1})
- db.posts.dropIndex("post_text_text")
- db.col.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : 1}}}]),$sum,$avg,$max,$min,$push,$addToSet,$first,$last
- aggregate的管道,$project,$match,$limit,$skip,$unwind,$group,$sort,$geoNear
- 全文索引search
类型type
类型 | 数字 |
---|---|
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 |
15 |
32-bit integer | 16 |
Timestamp | 17 |
64-bit integer | 18 |
Min key | 255 |
Max key | 127 |
副本配置
- mongod –port "PORT" –dbpath "YOUR_DB_DATA_PATH" –replSet "REPLICA_SET_INSTANCE_NAME"
- rs.initiate(),rs.conf(), rs.status()
- rs.add(HOST_NAME:PORT)
分片
结构
- Shard:用于存储实际的数据块
- Config Server:mongod实例
-
Query Routers:前端路由
备份与恢复
- mongodump -h dbHost –port dbPort -d dbName -c collection -o dbdirectory
- mongorestore -h dbhost -d dbname –directoryperdb dbdirectory
监控
- mongostat
- mongotop
高级
关联查询
- var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
- var addresses = db.address.find({"_id":{"$in":result[“address_ids”]}})
数据库引用
"address": {
"$ref": "address_home",
"$id": ObjectId("534009e4d852427820000002"),
"$db": "w3cschoolcc"}
查询分析
- explain:indexOnly,cursor,n,nscanned,millis,indexBounds
- hint:强迫MongoDB使用一个指定的索引
原子操作
findAndModify,set,unset,inc,push,pushAll,pull,addToSet,pop,rename,bit
高级索引
- 数组:db.users.ensureIndex({"tags":1})
- 子文档:db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
索引限制
- 集合中索引不能超过64个
- 索引名的长度不能超过125个字符
- 一个复合索引最多可以有31个字段
ObjectId
- 12字节 BSON 类型数据,时间戳4+机器标识码3+PID2+随机数3
- ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()
- ObjectId.str
正则表达式
db.posts.find({post_text:{$regex:"w3cschool.cn",$options:"$i"}})