mongodb学习1

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:修复并压缩当前数据库,很耗时。

 

固定集合:插入新文档要淘汰最早文档。


从节点可以作为备份的数据源,还可以扩展读取性能(将查询放在从节点上,这样主节点负载就减轻,但是数据复制并不是同步的,主节点插入更新后,从节点数据有片刻还不是最新的。。从节点的作用还有就是减少密集型处理的负载)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值