MongoDB学习笔记——聚合操作之group,distinct,count
单独的聚合命令(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语句
个元素,最多支持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两者必须有一个
- initial:reduce中使用变量的初始化
- 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 |
MongoDB学习笔记——聚合操作之group,distinct,count的更多相关文章
- MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)
MongoDB聚合管道 使用聚合管道可以对集合中的文档进行变换和组合. 管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示.聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点 ...
- MongoDB学习笔记——聚合操作之MapReduce
MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- MongoDB学习笔记(数据操作)
1. 批量插入: 以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封 ...
- MongoDB学习笔记——数据库操作
使用use数据库名称来创建数据库,如果该数据库已经存在则返回这个数据库 语句格式:use DATABASE_NAME >use mynewdb switched to db mynewdb 使用 ...
- MongoDB 学习笔记(python操作)
转自: http://blog.csdn.net/daillo/article/details/7030910
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html
随机推荐
- Java魔法堂:注释和注释模板
一.注释 1. 注释类型 [a]. 单行注释 // 单行注释 String type = "单行注释"; [b]. 多行注释 /* * 多行注释 */ String type ...
- 重构第7天 重命名(Rename )
理解:重命名就是把一些函数.字段.类.参数的名称 重命名为易于理解,最好是和自身的意义相同的名称.这样更易于理解,也可以减少大量的注释,名字即含义. 详解: 这个重构方法是我经常也是最常用的一种.我们 ...
- (Python学习4)List对象
1.PyListObject对象 typedef struct { PyObject_VAR_HEAD PyObject **ob_item; Py_ssize_t allocated; } PyLi ...
- javascript类的理解和使用
距离上次写博客已经过去好几个月了,现在手里的项目正好都结束了,闲暇之后开始理一下开发中一些问题,这次说一下javascript当中的类,可能很多人对于写惯了前台页面效果的coder来说,对于javas ...
- [moka同学笔记]yii2.0 advanced高级版 安装配置 与 rbac (Ⅰ)
1.下载地址:http://www.yiichina.com/download,下载 Yii2 的高级应用程序模板 2.配置与安装 在服务器www目录下yii2test [下载下来更改advance ...
- [moka同学笔记]yii2.0缓存
1.控制器中CacheDemoController.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/06/29 ...
- stl空间配置器线程安全问题补充
摘要 在上一篇博客<STL空间配置器那点事>简单介绍了空间配置器的基本实现 两级空间配置器处理,一级相关细节问题,同时简单描述了STL各组件之间的关系以及设计到的设计模式等. 在最后,又关 ...
- Java 进程占用 VIRT 虚拟内存超高的问题研究
1. 现象 最近发现线上机器 java 8 进程的 VIRT 虚拟内存使用达到了 50G+,如下图所示: 2. 不管用的 -Xmx 首先第一想到的当然使用 java 的 -Xmx 去限制堆的使用.但是 ...
- [js开源组件开发]js轮播图片支持手机滑动切换
js轮播图片支持手机滑动切换 carousel-image 轮播图片,支持触摸滑动. 例子见DEMO http://www.lovewebgames.com/jsmodule/carousel-ima ...
- IOS6学习笔记(四)
1.GCD设置一个timer计时器 - (void)awakeFromNib { __weak id weakSelf = self; double delayInSeconds = 0.25; _t ...