MongoDB中,一个数据库包含多个集合(类似关系型数据库的表),一个集合包含多个文档(类似关系型数据库的一行记录),文档存储方式是类JSON的BSON存储数据,BSON可以理解为在JSON格式上添加了一些JSON没有的数据类型。
文档:
两个文档之间有 嵌入式关系 和 引用式关系
集合:
集合就是各种文档的集合,MongoDB的同一个集合可以存储不同结构的多个文档,例如:
{"company":"Chenshi keji"} {"people":"man","name":"peter"}
元数据
数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.* DBNAME 可用 db 或数据库名替代
- DBNAME.system.namespaces :列出所有名字空间
- DBNAME.system.indexs :列出所有索引
- DBNAME.system.profile :列出数据库概要信息
- DBNAME.system.users :列出访问数据库的用户
- DBNAME.system.sources :列出服务器信息
数据库操作:
- show dbs 查看所有数据库
- db 查看当前的数据库对象或者集合
- use dbName 连接到dbName数据库
集合的操作:
- 创建集合
db.createCollection("users") //无参
db.createCollection("shiyanlou2", { capped : 1, autoIndexID : 1, size : 6142800, max : 10000 } )
参数描述:
- capped:类型为 Boolean,如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小;
- autoIndexID:类型为 Boolean,默认为 false,如果设置为 true,则会在 _id field.s 上自动创建索引;
- size:如果 capped 为 true 需要指定,指定参数的最大值,单位为 byte;
- max:指定最大的文档数。 在 Mongodb 中也可以不用创建集合,因为在创建文档的时候也会自动的创建集合。
- 查看集合
show collections
- 删除集合
db.users.drop
文档的操作:
- 数据的插入
insert()
db.users.insert([
... { name : "jam",
... email : "jam@qq.com"... },
... { name : "tom",
... email : "tom@qq.com"... }
... ])
save()
db.users.save([
... { name : "jam",
... email : "jam@qq.com"... },
... { name : "tom",
... email : "tom@qq.com"... }
... ])
- 数据的查询
查询整个集合
db.users.find()
db.users.find().pretty() //更美观的显示方式
and查询
db.users.find({ key1: value1, key2: value2 }).pretty()
or查询
db.users.find(
{
$or: [
{key1: value1},
{key2: value2}
]
}
).pretty()
同时使用and和or
db.post.find({
"number": {$gt:10},
$or: [
{"by": "shiyanlou"},
{"title": "MongoDB Overview"}
]
}).pretty()
{$gt:10} 表示大于10,另外,$lt 表示小于,$lte 表示小于等于,$gte 表示大于等于,$ne 表示不等于
- 数据的更新
db.shiyanlou.update({"user_id":2,"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}})
- 将 user_id=2 的文档的 e-mail 改为 group@qq.com
- 第一个大括号内容标示查找条件,第二个大括号内容则表示更新后的数据
- 默认的 update 函数只对一个文档更新,如果想作用所有文档,则需要加入 multi:true
- 替换已存在的数据
db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})
_id 对应的是要替换文档的 _id
- 删除数据
db.shiyanlou.remove({"name":"Bob"})
- 条件操作符
- 双精度型-1
- 字符串-2
- 对象-3
- 数组-4
- 二进制数据-5
- 对象ID-7
- 布尔类型-8
- 数据-9
- 空-10
- 正则表达式-11
- JS代码-13
- 符号-14
- 有作用域的JS代码-15
- 32位整型数-16
- 时间戳-17
- 64位整型数-18
- Min key-255
- Max key-127
db.shiyanlou.find({"name":{$type:2}})
查找name是字符串的文档记录。
- limit与skip
db.shiyanlou.find().limit(1) //读取一条记录,默认是排在最前面的那条被读取
db.shiyanlou.find().limit(1).skip(1) //读取时跳过指定数量的记录
- sort()
db.COLLECTION_NAME.find().sort({KEY:1|-1}) //升序1 降序-1
例如:
db.shiyanlou.find().sort({"time":1}
- 索引ensureIndex()
索引是特殊的数据结构,存储在容易遍历读取的数据集合里,是对数据库集合中的一个或者多个文档的值进行排序的一种结构。
db.COLLECTION_NAME.ensureIndex({KEY:1|-1}) //升序1 降序-1
例如:
db.shiyanlou.ensureIndex({"name":1})
- 查询分析
explain()显示查询的详细元数据
db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
结果中字段解释:
- indexOnly:为 true ,表示我们使用了索引;
- cursor:因为这个查询使用了索引,MongoDB 中索引存储在 B 树结构中,所以这是也使用了 BtreeCursor 类型的游标。如果没有使用索引,游标的类型是 BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的 system.indexes 集合(系统自动创建)来得到索引的详细信息;
- n:当前查询返回的文档数量;
- nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好;
- millis:当前查询所需时间,毫秒数;
- indexBounds:当前查询具体使用的索引。