> 데이터 베이스 > MySQL 튜토리얼 > mongodb聚合函数

mongodb聚合函数

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
풀어 주다: 2016-06-07 14:58:30
원래의
1369명이 탐색했습니다.

mongodb聚合函数 1.count 这个函数很好理解,和其他数据库一样,就是做一个count操作 select count(*) from tab1 =db.tab1.count() 以上例子很好理解,但是如果在操作中有skip,limit这种操作的话,那么count会忽略掉这些操作,必须加入一个true参数 比如:d

mongodb聚合函数

 

1.count

这个函数很好理解,和其他数据库一样,就是做一个count操作

select count(*) from tab1 =db.tab1.count() 

以上例子很好理解,但是如果在操作中有skip,limit这种操作的话,那么count会忽略掉这些操作,必须加入一个true参数

比如:db.tab1.find().skip(1),limit(2).count()和db.tab1.find().count()得出的结果是一样的

必须修改为db.tab1.find().skip(1).limit(2).count(true)

2.distinct

去重函数,这个也应该很熟悉,各种关系数据库都有

具体操作:db.runCommand({"distinct":"collection","key":"xxxx"})=db.collections.distinct("xxxx");

3.group

select a,b,sum(c) csum from coll where active=1 group by a,b

 db.coll.group( {key: { a:true, b:true },

                               cond: { active:1 },

                               reduce:function(obj,prev){ prev.csum += obj.c; },

                               initial: { csum: 0 }

                               });

参数解释:

Key:group字段

Reduce:聚合函数,典型的有sum和count操作,包含两个参数,当前遍历对象以及聚合计数器

Initial:初始化计数器值

Cond:查询条件筛选选项,如果是空,那么默认对当前collection的所有行操作

Group不能在sharding中使用,结果输出不能多于10000个keys

举例:

> db.mtb1.find()

{ "_id" : ObjectId("4fb4be52aa814943b788095c"), "name" : "aaa", "score" : 77 }

{ "_id" : ObjectId("4fb4be5caa814943b788095d"), "name" : "bbb", "score" : 79 }

{ "_id" : ObjectId("4fb4be61aa814943b788095e"), "name" : "ccc", "score" : 79 }

{ "_id" : ObjectId("4fb4be69aa814943b788095f"), "name" : "ddd", "score" : 79 }

{ "_id" : ObjectId("4fb4be74aa814943b7880960"), "name" : "eee", "score" : 100 }

{ "_id" : ObjectId("4fb4be7aaa814943b7880961"), "name" : "fff", "score" : 100 }

{ "_id" : ObjectId("4fb4be82aa814943b7880962"), "name" : "ggg", "score" : 100 }

{ "_id" : ObjectId("4fb4be9eaa814943b7880963"), "name" : "hhh", "score" : 200}

 

> db.mtb1.group(

... {key:{score:true},

... reduce:function(obj,prev){prev.count++;},

... initial:{count:0}

... });

[

        {

                "score" : 77,

                "count" : 1

        },

        {

                "score" : 79,

                "count" : 3

        },

        {

                "score" : 100,

                "count" : 3

        },

        {

                "score" : 200,

                "count" : 1

        }

]

一个简单的例子,应该很明白了。其实这里group还是建立在reduce上面

4.map/reduce

          这个工具的功能可以实现以上三种任何一种,它是分两步完成,先做map,再reduce,map首先对数据进行分解映射,map执行完,紧接着会进行reduce,map后会的到key-values,像{key:[value1,value2,value3...]},然后通过reduce处理后得到key-value,也就是单一的值。

语法:

db.runCommand(

 { mapreduce : ,

   map : ,

   reduce :

   [, query : ]

   [, sort : ]

   [, limit : ]

   [, out : ]

   [, keeptemp: ]

   [, finalize : ]

   [, scope : ]

   [, verbose : true]

 }

);

query是很常用的,它用来在map阶段过滤查询条件的以限定MapReduce操作的记录范围,sort和limit集合query使用。

out指定输出结果的collections名称

Keeptemp 布尔型,默认是false,如果是true那么生成的collection是永久存在的,如果是false,那么在客户端连接关闭后,会自动删除生成的collection

Finalize一般用来计算平均数,裁剪数组,清除多余信息

query是很常用的,它用来在map阶段过滤查询条件的以限定MapReduce操作的记录范围,sort和limit集合query使用。

out指定输出结果的collections名称

Keeptemp 布尔型,默认是false,如果是true那么生成的collection是永久存在的,如果是false,那么在客户端连接关闭后,会自动删除生成的collection

Finalize一般用来计算平均数,裁剪数组,清除多余信息

{ result : ,

  counts : {

       input :  ,

       emit  : ,

       output :

  } ,

  timeMillis : ,

  ok : ,

  [, err : ]

}

result:储存结果的collection的名字

input:满足条件的数据行数

emit:emit调用次数,也就是所有集合中的数据总量

ouput:返回结果条数

timeMillis:执行时间,毫秒为单位

ok:是否成功,成功为1

err:如果失败,这里可以有失败原因

 

给出官方文档的一个例子:

$ ./mongo

> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );

> db.things.insert( { _id : 2, tags : ['cat'] } );

> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );

> db.things.insert( { _id : 4, tags : []  } );

 

> // map function

> m = function(){

...    this.tags.forEach(

...        function(z){

...            emit( z , { count : 1 } );

...        }

...    );

...};

 

> // reduce function

> r = function( key , values ){

...    var total = 0;

...    for ( var i=0; i

...        total += values[i].count;

...    return { count : total };

...};

 

> res = db.things.mapReduce(m,r);

> res

{"timeMillis.emit" : 9 , "result" : "mr.things.1254430454.3" ,

 "numObjects" : 4 , "timeMillis" : 9 , "errmsg" : "" , "ok" : 0}

 

> db[res.result].find()

{"_id" : "cat" , "value" : {"count" : 3}}

{"_id" : "dog" , "value" : {"count" : 2}}

{"_id" : "mouse" , "value" : {"count" : 1}}

 

> db[res.result].drop()

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿