MongoDB备忘

Posted by 行如风 Blog on June 12, 2015

修改器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$inc:增加修改器,如果不存在,则创建,只能用于整数,长整数或双精度浮点数。修改其他类型需使用$set或数组修改器
如:{"$inc":{"pageviews":1}} 该字段增加1

$set:用来指定一个键的值。如果这个键不存在,则创建它。
如:db.test.update({"_id":ObjectId("557cdd093824608539956abe")},{"$set":{"mail":"1
23@qq.com"}})

$unset:将键完全删除。
如:db.test.update({"name":"ldm"},{"$unset":{"mail":1}})
<!--more-->
数组修改器:
$push:数组修改器。会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。

$ne:查询数组中是否包含这个值。
如作者不在列表中就添加:db.test.update({"name":{"$ne":"ldm"}},{"$push":{"name":"ldm"}})

$addToSet:如果数组中没有就添加,避免重复。
$each:和$addToSet组合起来,可以添加多个不同的值:
db.test.update({"_id":ObjectId("557cdd093824608539956abe")},{"$addToSet":{"emails":{"$each":["1@qq.com","2@qq.com","3@qq.com"]}}})

$pop:从数组任何一端删除元素。
如:{$pop:{key:1}}从数组末尾删除。{$pop:{key:-1}}从数组头部删除

$pull:有时要基于特定条件来删除元素,而不仅仅基于位置。会将匹配的部分删掉
如:{"$pull":{"todo":"laundry"}}

$:数组的定位操作符。用来定位查询文档已经匹配的元素,并进行更新。如:db.test.update({"name":{"comments.author":"tom"}},{"$set":{"comments.$.author":"ldm"}})

upsert更新

1
2
3
4
5
6
更高效,并且是原子性的,如果不存在则创建。如:
db.test.update({"count":25},{"$inc":{"count":3},true})
如果存在count为25,则结果为28,如果不存在,则创建25。
update第三个参数即为upsert更新。
update第四个参数为是否多文档更新,true false
db.runCommand({getLastError:1})可看到更新多少文档

save:

1
不存在时创建,存在时更新

2015-6-17更新

返回已更新的文档

1
2
3
4
5
6
7
8
findAndModify:能很好的解决竞争问题。但是速度有点慢。
用法:db.runCommand({"findAndModify":"process",
"query":{"status":"ready"},
"sort":{"priority":-1},
"remove":true
}).value
键值有:findAndModify:
query,sort,update,remove,new

2015-06-23更新

查询条件

1
2
$lt:<  $lte:<=   $gt>    $gte:>=    $ne:!=
如:db.test.find({"age":{"$lt":18}})

OR查询

1
2
3
4
$in:查询一个键的多个值,对应的$nin
$or:或。
如:db.test.find({"$or":[{"name":"ldm"},{"age":20}]})
and型查询,最小值置前,or查询,最大值置前

$not

1
2
3
4
5
$mod:将查询的值除以第一个给定的值,如余数等于第二个给定的值则返回该结果。
如:db.test.find({"age":{"$mod":[5,1]}})
返回1,6,11,16
如果想返回2,3,4,5...用$not:
db.test.find({"age":{"$not":{"$mod":[5,1]}}})

2015-06-28更新

null

1
查询键为null:db.test.find({"z":{"$in":[null],"$exists":true}})

$all

1
2
通过多个元素来匹配数组。如,查询即有apple又有banana的文档:
db.test.find({"fruit":{"$all":["apple","banana"]}})

$slice

1
返回数组的子集合:db.test.findOne(criteria,{"comments":{"$slice":[23,10]}})

$elemMatch

1
2
正确指定一组条件,将限定条件分组,仅当需要对一个内嵌文档的多个键操作时才会用到。如需要查询joe发表的5分以上的评论,则不能按每个键匹配。因为符合author条件的评论和符合score条件的评论可能不是一条评论,此时需要:
db.test.find({"comments":{"$elemeMatch":{"author":"joe","score":{"$gte":5}}}})

2015-7-7更新

索引

1
2
3
db.test.ensureIndex({"username":1})
db.test.ensureIndex({"username":1},{"background":true})  后台建立索引,不阻塞请求,速度较阻塞慢
db.test.dropIndex("username");db.test.dropIndex({"username":-1}),删除索引