您的位置:首页 > 数据库 > Mongodb

mongodb 基本语法总结

2015-06-28 16:42 756 查看
 

 

只总结了一些跟关系型数据库区别比较大的  应该注意的  难点的语法及概念

 

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

$group

HAVING

$match

SELECT

$project

ORDER BY

$sort

LIMIT

$limit

SUM()

$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:  用法很深   只有简单的例子一枚:

 

 

备份  分片  优化 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongdb 大数据 数据库