如果将数组看做队列,可以用$pop方法删除第一个或者最后一个元素 {$pop:{"key":-1}},{$pop:{"key":1}}…
用$addToSet更新可以避免重复,将它与$each组合起来,可以一次性添加多条(就算后添加的值已存在也没有关系) db.user.update({"name":"codingwhy.com"},{"$addToSet":{"hobby":{"$each":["singing","eating","dancing"]}}}) { "_i…
分片 1. 分片(sharding)是指将数据拆分,将其分散存放在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以 存储更多的数据,处理更大的负载. 2. MongoDB支持自动分片(autosharding),可以使数据库架构对应用程序不可见,也可以简化系统管理.对应用程序而言,好像始终在使用一个单机的MongoDB服务器一样.另一方面, mongoDB自动处理数据在分片上的分布,也更容易添加和删除分片技术.…
现在有一种查询变得越来越流行(尤其是移动设备):找到离当前位置最近的N个场所. MongoDB专为平面坐标查询做了专门的索引,称为地理空间索引. 同样需要用ensureIndex创建,不过,参数是两个 "2d" db.map.ensureIndex({"gps":"2d"}) gps键的值必须是某种形式的一对值:一个包含两个元素的数组或者包含两个键的内嵌文档,像这样 {"gps":[0,100]} {"gps&quo…
只要满足索引的其中之一不同即可 db.blog.ensureIndex({"username":1,"blogname":1}) 作者和作品名其中之一不同即可创建复合唯一索引. explain() hint() explain()可以返回查询使用的索引情况 hint()可以强制cursor使用某索引 但是通常MongoDB 的查询优化器非常智能,会替你选择改用哪一个索引.…
MongoDB中的索引,可以看作是书的目录. 想象一下给你一本没有目录的书,然后让你去查询指定内容,我只想说,我不是电脑,我很蛋疼! 让你翻没有目录的书,就跟让电脑查询没有索引的集合一样,从头查询到尾,毫无头绪,我们称这种行为是"表扫描" 索引简介 通常我们要查询一个user的名字,我们是这样的 db.user.find({"username":"codingwhy"}) 如果我们经常需要对username进行查询,那么我们可以为它建立索引 db…
MongoDB的文档必须有一个_id键. 目的是为了确认在集合里的每个文档都能被唯一标识. ObjectId 是 _id 的默认类型. ObjectId 采用12字节的存储空间,每个字节两位16进制数字,是一个24位的字符串. 12位生成规则: [0,1,2,3] [4,5,6] [7,8] [9,10,11] 时间戳 |机器码 |PID |计数器 前四位是时间戳,可以提供秒级别的唯一性. 接下来三位是所在主机的唯一标识符,通常是机器主机名的散列值. 接下来两位是产生ObjectId的PID,确…
第一个参数 MongoDB使用find来进行查询,查询呢,就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合. find的第一个参数决定了要返回那些文档,其形式也就一个文档,说明了要执行的查询细节. 通常呢,大家看到的find查询基本都长这个样子 db.user.find({}) db.user.find({"name":"qianjiahao"}) db.user.find({"name":"qianjiahao"…
upsert是一个选项,它是update的第三个参数,并不是一个方法.它是一种特殊的更新,要是没有文档符合匹配,那么它就会根据条件和更新文档为基础,创建新的文档,如有匹配,则正常更新.咱们之前见到的所有update操作,都是建立在有文档的基础之上的.upsert非常方便,不必预制集合,同一套代码既可以创建又可以更新. 超市需要修改商品的价格,比如将苹果的价格上调0.5元,但是店主不确定自己是否有购进苹果(偶尔会犯糊涂),那么他可以这样 db.supermarket.update({"name&q…
如果要操作数组中的值,可以用值在数组中的位置当做参数来删除 db.user.update({"name":"codingwhy.com"},{"$set":{"hobby.0":"crying"}}) { "_id" : ObjectId("55082691591555a6c35dd698"), "name" : "codingwhy.c…