1.文档是其数据的基本单元,多个键值对放置在一起便是文档。文档中的键值对是有序的,键是字符串,文档不能有重复的键。区分类型和大小写。
2.单个实例可以容纳对个独立的数据库,每一个都有自己的集合和权限。
3.使用多个集合是有好处的,索引是按照集合定义的。集合命名不能以“system”开头,不能含$.
4.多个文档组成集合,多个集合组成数据库,多个数据库组成mongodb实例。
5.将一个应用的数据存储在一个数据库。数据库名最终会变成文件系统的文件。几个数据库:admin(权限数据库,要是将一个用户添加到这个数据库,这个用户继承所有数据库的权限);local(这个数据永远不会被复制,用来存储限于本地单台服务器的任意集合);config(当mongodb用于分片设置时,它在内部使用,用于保存分片的信息)
6.数据库名放在集合名前面就得到集合的完全限定名(命名空间,实际应该小于100字节)。
7.其shell是javascript解析器,几个基本shell:
(1)创建insert:
item={“title”:”hadop”,”age”:25}
db.blog.insert(item)
db.blog.find() //最多显示20个匹配文档
(2)读取:
find()和findOne()
(3)跟新update
post.comment=[]
db.blog.update({“title”:”hadoop”},post)
db.blog.find()
(4)删除remove
db.blog.remove({“title”:”hadoop”})
8._id类型是ObjectId,全局唯一的。ObjectId使用12字节存储,每个字节两位16进制数,是一个24位的字符串。是实际存储数据的两倍长。(时间戳+机器主机名散列值+PID+计数器)
9.批量导入只是单个TCP请求,避免许多零碎请求的开销,批量导入也有限制。
10插入的原理:将数据转化为BSON,再将其送到数据库,数据库解析BSON,检验是否包含_id键且文档不超过4M。大于4M的文档不能存到数据库。查看doc转化为BSON的大小,Object.bsonsize(doc).mongodb。在插入时不执行代码。
11.数据删除:
db.demo.remove({“title”:”hello”})
删除demo集合中所有文档,不删除集合本身,原来的索引保留。永久性的,不能撤销和恢复。
删除文档很快,但是要清除整个集合,直接删除集合(然后创建索引会更快。
db.user.drop();删除集合
12.更新
原子性的,最后更新的为准
13.更新文档:
(1)文档替换
db.users.update({“title”:”qq”} , joe)
(2)使用修改器
a).$set修改器:指定一个键的值,如果键不存在则创建。
db.users.update({“title”:”qq”} ,{“$set”:{“mail”:”ganji”}})
b).$inc修改器:增加已有键的值,或在键不存在时创建键。
db.users.update({“title”:”qq”} ,{$inc:{“score”:12}})
c)数组修改器
$push:向已有的数组末尾加入一元素,要是没有则创建。
db.users.update({“title”:”qq”} , {“$push” :{“comments” :……}})
$ne:如果一个值不在数组里就把他加进去,可以在查询文档中用$ne
db.users.update({“name”: {“ne” : “jcdd”}} ,{“$push”: {“name”: “jcdd”}})
$addToSet:元素加入数组中,可以避免重复。
$each:$addToSet和$each结合起来可以添加多个不同的值.
db.user.update({“title”:”cc”} , {“$addToSet”: {“$each” : [“”….]}})
$pop:删除数组元素(把数组当做队列或者栈)
{$pop : {key :1}}从数组末尾删除一元素
{$pop : {key :-1}}从数组头部删除一元素
$pull:基于特定条件删除元素:
{“pull”:{“title”:”aa”}}
下标操作数组
14.upsert:如果没有符合条件文档则以条件创建新文档,若果找到了文档则更新。体现在update的第三个参数(默认是false,没找到就啥也不做,若设置为true,没找到则创建)。
db.demo.update({"count":12} ,{"$inc" : {"count" :145}} ,true)
15.save:文档不存在时插入,存在时更新,只有一个参数:文档
var x = db.demo.findOne()
x.num=1111;
db.demo.save(x)或者db.demo.update({“_id”:x._id} ,x)
16.更新匹配的多个文档:设置update的第四个参数为true.
db.demo.update({} ,{“$inc”:{x:1}} ,false ,true)
想要查看更新了多少文档:db.runCommand({getLastError:1}),n的值就是。
17.findAndModify
ps=db.runCommand({“findAndModify”:”jihename” , “query”:{“sta”:”aaa”}, “sort”:{“pro”:-1} ,”update” : {“$set” :{“sta”:”run”}})
findAndModify既有update也有remove,他们必须只有一个。匹配不到文档则报错。它一次只能处理一个文档
18.插入、删除、更新都是瞬间完成的,不需要等待数据库响应。不是异步操作。
19.数据库为每个连接创建一个队列,存放这个连接的请求。客户端发送一个请求,会被放到队列尾部。打开两个shell就有两个数据库连接。
20.find(arg1,arg2)
arg1:querykv ; arg2:指定需要返回的kv
db.users.find({} , {“username”:1 , “age”:1})
db.users.find({} , {“username”:0 , “age”:0})剔除结果中的Kv
$lt ,$lte , $gt ,$gte对应<,<=,>,>=
db.users.find({“age”: {“$gte”:18 , “$lte”:30}})
$ne:不等于
$in:一个键多个值匹配。$nin
db.user.find({“title”: {“$in”:[12,13,14]}})
$or:或查询
db.user.find({“$or” :[{…},{…}]})
$not:元条件句,用在任何条件之上,比如$mod
db.user.find({“id_num” :{“$not” :{“$mod”:[5,1]}}})
{“$mod” :[5,1]}除以5余数1。
正则表达式:系统接受正则表达式标志(i),不一定要有
db.usr.find({“name”:/joe/i})
数组查询:每个元素都是整个键的值。
$all:多个元素来匹配数组。
db.user.find({“fruit” :{“$all”:[“apple”,”banana”]}})
db.user.find({“fruit.2” :”apple”)//数组下标
$size:查询指定长度的数组。不能与$lt等一起使用
$slice:放回数组的子集合
db.user.find(.,{“comments”:[23,10]})//偏移量+长度
$where:可以执行任意javascript作为查询的一部分。
db.demo.find({“$where” : ”this.x+this.y ==10”})等价于
db.demo.find({“where”:“function() {return this.x+this.y == 10;}”})
避免$where,它比常规的慢,每个文档都要从BSON转换成javascript对象。
21.游标:
var cursor=db.demo.find()
while(cursor.hasNext()){
doc=cursor.next();
doc=process(doc);
db.demo.save(doc)
}
或者cursor.forEach(function(x){ print(x.title); });
limt,skip,sort
当调用find时,shell不立即查询数据库,而是等待正真开始要求获得结果时才开始发送查询。
db.demo.find().limit(3):限制显示结果数量
db.demo.find().skip(100):跳过多少记录
db.demo.find().sort(“size”:1):1代表升序,-1代表降序。
避免使用skip略过大量数据,耗时。
获取文档,处理后,保存到数据库时,若文档体积增加而预留空间不足时,将其挪到集合尾部。
$snapshot:boolean:确保查询的结果是在查询执行那一刻的一致快照。
在服务器端游标消耗内存资源。
db.serverStatus()
22.索引:ensureIndex
db.user.ensureIndex({“name”:1} ,{“background”:true})
background参数是让这个过程后台运行,同时正常处理请求,否则,数据库阻塞建立索引期间所有的请求。
缺点:每次插入更新删除都产生额外的开销。尽可能的少创建索引。一般的,要是查询要返回集合中一半以上的结果,用表扫描会比索引高效。
对没有建索引的键做sort,需将数据提取到内存来排序,不可能在内存中做T级别数据的排序。一旦集合大到不能在内存中排序,就报错。
unique唯一索引:db.user.ensureIndex({“name”:1},{“unique”:true})
为避免插入与唯一键重复的文档,可以用安全插入。
dropDups消除重复:db.user.ensureIndex({“name”:1} ,{“unique”:true,”dropDups”:true})
复合唯一索引
explain:得到查询细节
db.usr.find().explain()
hint:强制使用某个索引
db.usr.find().hint(“name”:1..)
索引的元数据存储在system.indexes集合中,这是个保留集合,只读的。system.namespaces集合也含有索引的名字。
dropIndexes:删除索引
db.runCommand({“dropIndexes”:”name”,”*”}),或者直接删除集合。
地理空间索引。
23聚合
count:文档数量
db.demo.count()
distinct:给定键的所有不同值。
db.runCommand({“distinct”:”集合名字” , “key”:”键名”})
group
mapreduce
24常用数据库命令
buildInfo:返回mongodb服务器版本和主机存储系统等
db.runCommand({"buildInfo":1})
collStats:返回集合的统计信息,数据大小、索引大小、已分配的存储空间
distinct:指定键的不同值
db.runCommand({“distinct”:”集合名字” , “key”:”键名”})
drop:删除集合的索引数据
{“drop”:”集合”}
dropDatabase删除数据库所有数据
{“dropDatabase”: 1}
dropIndexes:删除集合内的索引
getLastError:查看对本集合执行的最后一次操作的错误信息
isMaster:检查服务器是主服务器还是从服务器。
{“isMaster”:1}
listCommands:返回所有可以在服务器上运行的命令及其信息
listDatabases:列出服务器上所有的数据库
ping:检查服务器链接是否正常
renameCollection:集合重命名
{“renameCollection”:user.blog ,”to” :user.blogs}
serverStatus:返回这台服务器的管理统计信息
repairDatabase:修复并压缩当前数据库,很耗时。
固定集合:插入新文档要淘汰最早文档。
从节点可以作为备份的数据源,还可以扩展读取性能(将查询放在从节点上,这样主节点负载就减轻,但是数据复制并不是同步的,主节点插入更新后,从节点数据有片刻还不是最新的。。从节点的作用还有就是减少密集型处理的负载)。