博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB学习笔记——聚合操作之group,distinct,count
阅读量:5281 次
发布时间:2019-06-14

本文共 3199 字,大约阅读时间需要 10 分钟。

单独的聚合命令(group,distinct,count

单独聚合命令 aggregate性能低,比Map-reduce灵活度低;但是可以节省几行javascript代码,后面那句话我自己加的,哈哈哈~

count()方法可以查询统计符合条件的集合的总数

db.COLLECTION_NAME.count(<query>) // 此方法等价于 db.COLLECTION_NAME.find(<query>).count()

在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate

distinct命令可以找出给定键的所有去重之后的值。使用时也必须指定集合和键

db.runCommand({ distinct: "<collection>", key: "<field>", query: <query> }) //此方法等价于 db.collection.distinct(field, query)

参数说明:

  • collection :要查询的集合的名称
  • key:需要去重的字段的名称
  • query :可选参数, 指明查询条件,相当于SQL中的where语句

Group操作:mongodb2.2版本对于返回数据最多只包涵20000个元素,最多支持20000独立分组;对于超过20000的独立分组建议采用mapreduce

db.runCommand({

group:

{

ns: <namespace>,

key: <key>,

$reduce: <reduce function>,

$keyf: <key function>,

cond: <query>,

finalize: <finalize function>

}

}) //该方法等价于 db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })

参数说明

  • ns:集合名称
  • key:用来分组文档的字段。和keyf两者必须有一个
  • keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
  • initialreduce中使用变量的初始化
  • reduce:执行的reduce函数。函数需要返回值。
  • cond:执行过滤的条件。
  • finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

插入测试数据

for(var i=1; i<20; i++){

var num=i%6;

db.test.insert({_id:i,name:"user_"+i,age:num});

}

普通分组查询

 

db.test.group({

key:{age:true},

initial:{num:0},

$reduce:function(doc,prev){

prev.num++

}

});

db.runCommand({

group: {

ns: "test",

key: {

age: true

},

initial: {

num: 0

},

$reduce: function(doc,

prev){

prev.num++

}

}

});

筛选后分组查询

 

db.test.group({

key: {

age: true

},

initial: {

num: 0

},

$reduce: function(doc,

prev){

prev.num++

},

condition: {

age: {

$gt: 2

}

}

});

db.runCommand({

group: {

ns: "test",

key: {

age: true

},

initial: {

num: 0

},

$reduce: function(doc,

prev){

prev.num++

},

condition: {

age: {

$gt: 2

}

}

}

});

group联合$where查询

 

db.test.group({

key: {

age: true

},

initial: {

num: 0

},

$reduce: function(doc,

prev){

prev.num++

},

condition: {

$where: function(){

returnthis.age>2;

}

}

});

使用函数返回值分组

 

//注意,$keyf指定的函数一定要返回一个对象

db.test.group({

$keyf: function(doc){

return{

age: doc.age

};

},

initial: {

num: 0

},

$reduce: function(doc,

prev){

prev.num++

}

});

db.runCommand({

group: {

ns: "test",

$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;deletedoc.num;

}

});

db.runCommand({

group: {

ns: "test",

$keyf: function(doc){

return{

age: doc.age

};

},

initial: {

num: 0

},

$reduce: function(doc,

prev){

prev.num++

},

finalize: function(doc){

doc.count=doc.num;deletedoc.num;

}

}

});

关系型数据库与MongoDB数据库在一些术语上的对

MongoDB操作符

范例

关系型数据库(mysql)

关系型数据库范例

count()

count({"key":value}) find({"key":value}).count()

count

select count(1) from table where key=value

distinct

db.runCommand({"distinct":collectionname, "key":"key1",{'key2':value2}}) db.collectionname.distinct("key1",{key2:value2})

distinct

select distinct key1 from table where key2=value2

group

db.test.group({ key:{age:true}, initial:{num:0}, $reduce:function(doc,prev){ prev.num++ }, condition:{$where:function(){ return this.age>2; } } });

group by

select count(1),key1 from table where key2=1 group by key1

转载于:https://www.cnblogs.com/AlvinLee/p/6069637.html

你可能感兴趣的文章
memcahced部署
查看>>
Sublime Text插件
查看>>
状态栏的隐藏
查看>>
坚持不一定成功,放弃一定失败
查看>>
Java虚拟机读书笔记1——内存区域划分
查看>>
npm install -S -D -g 有什么区别
查看>>
Streak OpenCart 商城自适应主题模板 ABC-0010
查看>>
curl 要么 file_get_contents 获得授权页面的方法的必要性
查看>>
Python学习路径8——Python对象2
查看>>
asp.net弹出层实例
查看>>
phantomjs环境搭建已经运行
查看>>
Vim简明教程【CoolShell】
查看>>
32bit GM命令
查看>>
VMware虚拟机提示找不到vmnetbridge.dl文件的解决办法
查看>>
浙江大学PAT上机题解析之1001. A+B Format (20)
查看>>
SQL 四种基本数据操作语句的基本使用
查看>>
管道和FIFO
查看>>
P1074 靶形数独
查看>>
C# 反射基础运用
查看>>
grid-layout实验
查看>>