只总结了一些跟关系型数据库区别比较大的 应该注意的 难点的语法及概念
1.db.collection.update( criteria, objNew, upsert, multi )
Db.collection.distinct(“title”)返回一个title 的json
Db.collection.group(key initial reduce)
Group 不支持分片 可以用mapreduce解决。
Key 分组的键 initial 分组结果提供基数 reduce (正在当前遍历的当前文档(调用数据库),和聚集计数对象(要显示的))
Eg:
db.test.group({key:{age:true},initial:{num:0},$reduce:function(doc,prev){
prev.num++
}});
//注意,$keyf指定的函数一定要返回一个对象
db.test.group({$keyf:function(doc){return {age:doc.age};},initial:{num:0},$reduce:function(doc,prev){
prev.num++
}
db.test.group({$keyf:function(doc){return {age:doc.age};},initial:{num:0},$reduce:function(doc,prev){
prev.num++
},
finalize: function(doc){ doc.count=doc.num;delete doc.num; }
}); finalize 可以在最终结算之前返回一个参数 比如平均数。
Mapreduce
MapReduce应该算是MongoDB操作中比较复杂的了,自己开始理解的时候还是动了动脑子的,所以记录在此!
命令语法:详细看
db.runCommand( { mapreduce : 字符串,集合名, map : 函数,见下文 reduce : 函数,见下文 [, query : 文档,发往map函数前先给过渡文档] [, sort : 文档,发往map函数前先给文档排序] [, limit : 整数,发往map函数的文档数量上限] [, out : 字符串,统计结果保存的集合] [, keeptemp: 布尔值,链接关闭时临时结果集合是否保存] [, finalize : 函数,将reduce的结果送给这个函数,做最后的处理] [, scope : 文档,js代码中要用到的变量] [, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认true] //注:false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,<br> //true时BSON-->js-->map-->reduce-->BSON [, verbose : 布尔值,是否产生更加详细的服务器日志,默认true] } ); |
$ne 之外的所有文档
$in nin:[,,]
$all 满足所有
$or
$mod:[2,1] 奇偶
$slice [1,2] 第一个参数 返回数据项的总数 第二个 有参数则第一个为偏移量
且 slice 放在{},后面
$size 显示数组个数
$exists title :{~:true} 现实带有title的所有文档
$not ds
创建验证码的同时 创建一个时间戳 发送 过来的时候在创建一个
robot.Set()
http://www.cnblogs.com/mxw09/archive/2011/08/31/2161457.html(group讲解)
update()函数接受以下四个参数:
· criteria : update的查询条件,类似sql update查询内where后面的。
· objNew : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
· upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
· multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
2.$type 根据参数类型查询
$type操作符是基于BSON类型来检索集合中匹配的结果。
MongoDB中可以使用的类型:
类型描述 | 类型值 |
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
Object id | 7 |
Boolean | 8 |
Date | 9 |
Null | 10 |
Regular expression | 11 |
JavaScript code | 13 |
Symbol | 14 |
JavaScript code with scope | 15 |
32-bit integer | 16 |
Timestamp | 17 |
64-bit integer | 18 |
Min key | 255 |
Max key | 127 |
3.· > db.t.find().sort({_id:-1}).skip(1).limit(1)
· { "_id" : 8 }
· > db.t.find().skip(1).sort({_id:-1}).limit(1)
· { "_id" : 8 }
· > db.t.find().skip(1).limit(1).sort({_id:-1})
· { "_id" : 8 }
当你调用find方法的时候,shell并不会立刻去查询数据库,直到你真正请求结果的时候才发送查询,这样你可以在实际执行查询之前,追加一些其他的选项,游标的这些方法几乎都是返回游标本身,所以你可以按任意顺序链入这些方法,所以以上三个查询是等价的。
但是
db.c.find().sort({username : 1, age : -1})
MongoDB处理不同的类型的数据是有顺序的.有时候一个键的值可能是多种类型的,如:整数,布尔型,字符串或null.如果对这种混合类型的键进行排序,其排序顺序从小到大如下:
1. Minimum value
2. null
3. Numbers (integers, longs, doubles)
4. Strings
5. Object/document
6. Array
7. Binary data
8. Object ID
9. Boolean
10. Date
11. Timestamp
12. Regular expression
13. Maximum value
最小值,null,数字,字符串,对象/文档,数组,二进制数据,对象id,布尔型,日期型,时间戳,正则表达式,最大值.
4.sort() 1升序 -1降序
5.创建索引
db.values.ensureIndex({open: 1, close: 1}, {background: true})
6.聚合查询
WHERE | $match |
GROUP BY | |
HAVING | |
SELECT | |
ORDER BY | |
LIMIT | |
SUM() | |
COUNT() | $sum |
· $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。(select)
· $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。 (Where having)
· $limit:用来限制MongoDB聚合管道返回的文档数。
· $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
· $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
· $group:将集合中的文档分组,可用于统计结果。
· $sort:将输入文档排序后输出。
· $geoNear:输出接近某一地理位置的有序文档。
7.MongoDB 引用有两种:
· 手动引用(Manual References)
· DBRefs
· $ref:集合名称
· $id:引用的id
· $db:数据库名称,可选参数
http://www.w3cschool.cc/mongodb/mongodb-database-references.html
8.查询分析
db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
"cursor" : "BtreeCursor gender_1_user_name_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 0,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
· indexOnly: 字段为 true ,表示我们使用了索引。
· cursor: 因为这个查询使用了索引,MongoDB中索引存储在B树结构中,所以这是也使用了BtreeCursor类型的游标。如果没有使用索引,游标的类型是 BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建, 由于存储索引信息,这个稍微会提到)来得到索引的详细信息。
· n:当前查询返回的文档数量。
· nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好。
· millis:当前查询所需时间,毫秒数。
· indexBounds:当前查询具体使用的索引。
Hint 制定搜索
db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
原子操作常用命令
http://chenzhou123520.iteye.com/blog/1637629
$set
用来指定一个键并更新键值,若键不存在并创建。
{ $set : { field : value } }
$unset
用来删除一个键。
{ $unset : { field : 1} }
$inc
$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
{ $inc : { field : value } }
$push unset pull 对比
用法: 可以添加数组 也可以更新数组
{ $push : { field : value } }
· db.students.find()
· { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
· > db.students.update({name:"chenzhou"},{$push:{"ailas":"Michael"}})
· > db.students.find()
· { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
· >
把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。
$pushAll
同$push,只是一次可以追加多个值到一个数组字段内。
{ $pushAll : { field : value_array } }
$pull
从数组field内删除一个等于value值。
{ $pull : { field : _value } }
· { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
· > db.students.update({name:"chenzhou"},{$pull:{"ailas":"A1"}})
· > db.students.find()
· { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A2" ], "name" : "chenzhou" }
$addToSet 在数组内添加数组
增加一个值到数组内,而且只有当这个值不在数组内才增加。
· > db.students.find()
· { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
· > db.students.update({name:"chenzhou"},{$addToSet:{"ailas":["A3","A4"]}})
· > db.students.find()
· { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
· >
$pop 同pull 的区别是 pop不知道要删除value的名字
删除数组的第一个或最后一个元素
{ $pop : { field : 1 } }
$rename
修改字段名称
{ $rename : { old_field_name : new_field_name } }
$bit
位操作,integer类型
{$bit : { field : {and : 5}}}
高级篇:聚合框剪
db.gg.aggregate([{$match:{}},{$group:{_id:{cu_id:"$cu_id",status:"$status"},to
tal:{$sum:"$amount"}}},{$limit:4},{$sort:{total:-1}}])
$unwind
$project 用法
mapReduce: 用法很深 只有简单的例子一枚:
备份 分片 优化