MongoDB学习笔记

这是一个比较优秀的关于MongoDB的文档:

http://blog.csdn.net/yiqijinbu/article/details/9053467


MongoDB的_id 和ObjectId

_id 字段是由客户端生成,保存在数据库的文档的建。默认类型是ObjectId类型。
ObjectId类型使用12个字节的存储空间,每个字节两位十六进制的数字。0~3:时间戳   4~6:机器    7~8:PID       9~11:计数器
时间戳:记录文档创建的时间,驱动提供获取_id的时间。
机器:机器码,保证同一时刻不同机器生成的_id不同。
PID:进程id,保存同一时刻同一机器同一不同进程生成的_id 不同。
计数器:自动增加的计数器,确保同一时刻同一进程生成的_id 不同。同一时刻最多允许一个进程生成256^3(16777216)个不同的_id。


$set指定一个键的值,如果不存在创建它。
$inc增加已有键的值,如果不存在创建它,只能对int,long,double.专门用来增加数字


$push对数组进行操作,指定键存在,会向存在的数组末尾添加一个元素,不存在创建一个数组。


$ne如果一个值不在数组里面就把它加进去。
$addToSet如果一个值不在数组里面就把它加进去。可以避免重复。
$addToSet和$each组合起来可以添加多个不同的值。


$pop删除数组中的元素,把数组看成队列,可以从数组的任意一端删除元素。
{$pop:{key:1}}从数组尾部删除元素
{$pop:{key:-1}}从数组头部删除元素
$pull删除数组所有匹配部分的元素


要是用户John把名字改成Jim,就可以用定位符替换评论中的名字:
db.blog.update({"conmments.author":John},{"$set":{"comments.$.author":"Jim"}})
"$"表示操作定位符,用来定位查询文档已经匹配的元素,并进行更新。
定位符只更新一个匹配的元素。


数组修改器,如果修改器改变了文档大小就比较慢。
$push或其他的数组修改器推荐使用,要是$push 成为瓶颈,可以将内嵌数组独立出来。




upsert:要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。
update({"url":"/blog"},{"$inc":{"count":3}},ture)
update的第三个参数标示这个是upsert.


MongoDB会有两个版本,一个是安全办,一个是普通版。




find()
第一个参数指定查询条件,第二个参数指定想要的键,1:表示要返回的键,0:表示不换回的键




$lt   <
$lte  <=
$gt   >
$gte  >=


$ne   !=(可以用于所有类型的数据)


$in 包含
$nin不包含
$or或
$mod 会将查询的值除以第一个给定值,若余数等于第二个给定值则返回改结果。
db.users.find({"id_num":{"$mod":[5,1]}})
上面的查询会返回id_num值为1,6,11,16等的用户。但要想返回id_num为2,3,4,5,7,8,9,10,12等的用户,
就要用$not
db.users.find({"id_num":{"$mod":[5,1]}})


$exists 是否存在指定的键
find({head: { $exists : true }})查询head字段不为空的文档


{"fruit":["apple","bananan","peach"]}
find({"fruit":"bananan"})会成功匹配改文档


$all 


find({"fruit.2":"peach"})匹配数组中第三个为peach的文档


$size查询指定长度的数组


$slice返回数组的一个子集合。
find(criteria,{"comments":{"$slice":10}})返回前10条评论
find(criteria,{"comments":{"$slice":-10}})返回后10条评论


find(criteria,{"comments":{"$slice":[23,10]}})跳过前23个元素,返回第24个~第33个元素。
如果数组不够33个元素,着返回第23个元素后面的所有元素。


$elemMatch将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到。
这种模糊的命名条件句能用来部分指定匹配数组中的单个内嵌文档的限定条件。
find({"comments":{"$elemMatch":{"author":"joe","score":{"$gte":5}}}})


$where查询,效率很低,速度慢。不能利用索引。所以,只在走投无路时才考虑。


游标,MongoDB的游标,不是客户端执行完游标语句服务器就立刻响应,而是,当客户端执行cursor.hasNext()或cursor.next()语句时,查询被发往服务器。
服务器返回一组结果,客户端用完了一组结果,客户端会再次联系服务器,要更多结果。一直会持续到游标耗尽或者结果全部返回。
游标要尽快释放。
游标在作用域中,10分钟不使用就会自动的销毁。
也可以通过immortal的函数设置游标不超时。


explain返回查询使用的索引情况(如果有的话),耗时及扫描文档数的统计信息。
find().explain()


聚合:
count()返回集合中文档的数量。
distinct用来找出给定键的所有不同的值。


记住,由于精度的问题,绝对不要将金额以浮点数的方式存储。



limit 限制查询结果数量。find().limit(3):返回3条结果。
skip 跳过指定个数。find().skip(3):跳过前三个匹配的文档,然后返回余下的文档。略过过多的结果会导致性能问题。


sort:排序的方向可以1(升序),-1(降序)。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值