Mongodb聚合函數

?

插入 測試數據

復制代碼
for(var j=1;j<3;j++){    
for(var i=1;i<3;i++){    var person={Name:"jack"+i,Age:i,Address:["henan","wuhan"],Course:[{Name:"shuxue",Score:i},{Name:"wuli",Score:i}]}db.DemoTest.Person.insert(person)     
}
}
復制代碼

?

Count

db.DemoTest.Person.count({Name:"jack1"})

返回數量

?

?distinct

db.DemoTest.Person.distinct("Name")

返回不重復的Name值。

?

?group

例子:按照Name分組,條件是Age大于46

復制代碼
db.DemoTest.Person.group({"key":{"Name":true}, -----分組的keky"initial":{"Person":[]},-------每組分享的一個”初始化函數“"$reduce":function(cur,prev){   ------這個函數的第一個參數是當前的文檔對象,第二個參數是上一次function操作的累計對象,第一次為initial中的{”person“:[]}。有多少個文檔, $reduce就會調用多少次

prev.Person.push(cur);
},"finalize":function(prev){   ---返回每組的數量     prev.count=prev.Person.length;  },"condition":{"Age":{"$lt":46}}   -----過濾條件})
復制代碼

返回結果如下:

?返回的json

?

?mapReduce

?mapReduce其實是一種編程模型,用在分布式計算中,其中有一個“map”函數,一個”reduce“函數。

? ?map:

? ? ? ? ? 這個稱為映射函數,里面會調用emit(key,value),集合會按照你指定的key進行映射分組。

? ?reduce:

? ? ? ? ?這個稱為簡化函數,會對map分組后的數據進行分組簡化,注意:在reduce(key,value)中的key就是

? ? ? emit中的key,vlaue為emit分組后的emit(value)的集合,這里也就是很多{"count":1}的數組。

? ?mapReduce:

? ? ? ? ? 這個就是最后執行的函數了,參數為map,reduce和一些可選參數。

?

在MongoDB存儲的文檔上執行聚合操作非常有用,這種方式的一個限制是聚合函數(比如,SUM、AVG、MIN、MAX)需要通過mapper和reducer函數來定制化實現。

MongoDB沒有原生態的用戶自定義函數(UDFs)支持。但是它允許使用db.system.js.save命令來創建并保存JavaScript函數,JavaScript函數可以在MapReduce中復用。

?

第一種統計方式--對應集合直接統計

1.在MongoDB javascript Shell中對Array對象進行了一些擴展,其中新增sum方法,以方便統計數據之用的。

復制代碼
Array.sum=function(arr){
if(arr.length == 0)
return null;
var s = arr[0];
for(var i = 1; i < arr.length; i++)
s += arr[i];
return s;
}
復制代碼

2.例子:按照名稱分組,統計每組年齡的和,條件是年齡小于2.

如果統計數量:var map = function(){ emit(this.Name, 1); } ? 其實是讓值永遠為1

var map = function(){ emit(this.Name, this.Age); }
var reduce = function( key, values ){ return Array.sum(values); }
var options = {query: { Age: {$lt: 2} }, out: { inline : 1 }}
db.Person.mapReduce(map,reduce,options)

結果如下

?結果json

?

分析一下:
1. map部分
作用:用于分組的。
emit(param1, param2)
param1:需要分組的字段,this.字段名。
param2:需要進行統計的字段,this.字段名。

2. reduce部分
作用:處理需要統計的字段
var reduce = function(key, values){
......統計字段處理
}
key: 指分組字段(emit的param1)對應的值
values:指需要統計的字段(emit的param2)值組成的數組

簡單介紹統計常用的方法:
* 對數值類型進行求和

1
2
3
4
<span style="font-size: 16px;">var?reduce = function(key, values){
return?Array.sum(values);
}
</span>

* 對字符串類型進行拼湊

1
2
3
<span style="font-size: 16px;">var?reduce = function(key, values){
return?values.join(', ');
}</span>

3. options部分
{ query: { age: {$lt: 25} }, out: "name_totals" }
query:先篩選符合條件的記錄出來,再進行分組統計。
out:將分組統計后的結果輸出到哪個集合當中。
默認情況下,out所指定的集合在數據庫斷開連接后再次打開時,依舊存在,并保留之前的所有記錄的。

4. 執行分組統計
>db.集合名.mapReduce( map, reduce, options )

?

第二種統計方式--命令統計

1.命令如下:

注意:out參數?out:"Person_Name" 代表會創建一個臨時表Person_Name 然后再從臨時表中查找,out:{inline:1} 代表直接顯示在當前命令執行的結果中

復制代碼
var map = function(){ emit(this.Name, this.Age); }
var reduce = function( key, values ){ return Array.sum(values); }
db.runCommand({mapreduce:"Person",map:map,reduce:reduce,out:"Person_Name",keeptemp: false,query: { Age:{ $lt: 2 }},sort:{ Name:1},
limit:3
})
復制代碼

?解析:
mapreduce:
分組統計的集合名
eg:
mapreduce: 'mythings'
不能寫成mapreduce: mythings,否則報異常:mythings is not defined

map,reduce :
同上,不做闡述

out :
將分組統計結果輸出到某個集合。
注意:不能缺省,必須指定名稱,否則報錯,報錯如下:
“exception: 'out' has to be a string or an object”

keeptemp :
是否保留臨時集合(指out指定的集合)
keeptemp:false時會在數據庫斷開連接后,MongoDB會移除該集合的所有記錄。而不是刪除。
keeptemp:true時即使數據庫斷開連接后,再次連接上,該臨時集合依舊保持之前所有記錄。
keeptemp默認值為true。

query :
篩選記錄后,再進行分組統計
eg:
query: { age:{ $lt: 25 }}

sort :
對分組統計的集合進行排序,也即先排序,后再執行分組統計的。
注意:這里的排序需要用到索引,必須先創建索引。

limit :

對分組統計的集合先進行限制返回記錄的條數,然后再去進行統計操作。注意:不要理解成對統計后的結果進行限制返回記錄條數。

verbose :
顯示時間統計信息,取值為true/false

轉載于:https://www.cnblogs.com/wangjing666/p/6837131.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php rename函數_php rename函數怎么用

PHP rename()函數用于重命名文件或目錄&#xff0c;語法“rename(文件舊名稱,新名稱,句柄環境)”&#xff0c;使用用戶指定的新名稱更改文件或目錄的舊名稱&#xff0c;并且可以根據需要在目錄之間移動&#xff1b;成功時返回True&#xff0c;失敗時返回False。php rename()函數…

Java BigInteger類| xor()方法與示例

BigInteger類的xor()方法 (BigInteger Class xor() method) xor() method is available in java.math package. xor()方法在java.math包中可用。 xor() method is used to perform xor operation between this BigInteger and the given BigInteger and we all know when we pe…

Spring Data Redis實戰之提供RedisTemplate

為什么80%的碼農都做不了架構師&#xff1f;>>> 參考&#xff1a; http://www.cnblogs.com/edwinchen/p/3816938.html 本項目創建的是Maven項目 一、pom.xml引入dependencies <dependency><groupId>org.springframework.data</groupId><artif…

Java BigInteger類| and()方法與示例

BigInteger類和()方法 (BigInteger Class and() method) and() method is available in java.math package. and()方法在java.math包中可用。 and() method is used to perform and operation between this BigInteger and the given BigInteger (val) [i.e. (this BigInteger)…

php映射,PHP實現路由映射到指定控制器

自定義路由的功能&#xff0c;指定到pathinfo的url上,再次升級之前的腳本SimpleLoader.phpclass SimpleLoader{public static function run($rulesarray()){header("content-type:text/html;charsetutf-8");self::register();self::commandLine();self::router($rule…

stl vector 函數_vector :: clear()函數,以及C ++ STL中的示例

stl vector 函數C vector :: clear()函數 (C vector::clear() function) vector::clear() is a library function of "vector" header, it is used to remove/clear all elements of the vector, it makes the 0 sized vector after removing all elements. vector …

Commonjs規范及Node模塊實現

前面的話 Node在實現中并非完全按照CommonJS規范實現&#xff0c;而是對模塊規范進行了一定的取舍&#xff0c;同時也增加了少許自身需要的特性。本文將詳細介紹NodeJS的模塊實現 引入 nodejs是區別于javascript的&#xff0c;在javascript中的頂層對象是window&#xff0c;而在…

thinkphp3 php jwt,ThinkPHP5 使用 JWT 進行加密

- 使用 Composer安裝此擴展- 代碼示例<?php /*** [InterCommon-接口公用]* Author RainCyan* DateTime 2019-08-12T16:38:080800*/namespace app\hladmin\controller;use think\Controller;use \Firebase\JWT\JWT;class InterCommonController extends Controller {private…

數據管理與商業智能_商業智能與數據科學

數據管理與商業智能In this heavily jargonized trade, the words typically overlap one another, leading to a scarcity of understanding or a state of confusion around these ideas. whereas big data vs analytics or computing vs machine learning vs cognitive inte…

JavaWeb網上圖書商城完整項目--day02-14.登錄功能的login頁面處理

1、現在注冊成功之后&#xff0c;我們來到登錄頁面&#xff0c;登錄頁面在于 在登錄頁面。我們也需要向注冊頁面一樣對登錄的用戶名、密碼 驗證碼等在jsp頁面中進行校驗&#xff0c;校驗我們單獨放置一個login.js文件中進行處理&#xff0c;然后login.jsp加載該js文件 我們來看…

php多線程是什么意思,多線程是什么意思

線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程之中&#xff0c;是進程中的實際運作單位&#xff0c;而多線程就是指從軟件或者硬件上實現多個線程并發執行的技術&#xff0c;具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程&#…

c++一個類創建多個對象_C ++ | 創建一個類的多個對象

c一個類創建多個對象In the below program, we are creating a C program to create multiple objects of a class. 在下面的程序中&#xff0c;我們正在創建一個C 程序來創建一個類的多個對象 。 /* C program to create multiple objects of a class */#include <iostrea…

Activity中與ListActivity中使用listview區別

一.Activity中與ListActivity中使用listview區別&#xff08;本身沒多大區別&#xff0c;只是ListActivity在listview的顯示上做了一些優化&#xff09;Activity中使用Listview步驟&#xff1a;1.xml布局中,ListView標簽id可以任意取值如&#xff1a;<ListView andro…

java相關是什么,什么是java

java基礎常見面試題&#xff0c;這是一篇超長的隨筆&#xff01;&#xff01;&#xff01;1. Java基礎部分....................................................... 4 1、一個".java"源文件中是否可以包括多個類(不是內部類)&#xff1f;有什么限制&#xff1f;.. …

如何在Scala中將Double轉換為String?

Double in Scala is a data type that stores numerical values that have decimals. It can store a 64-bit floating point number. Scala中的Double是一種數據類型&#xff0c;用于存儲帶有小數的數值。 它可以存儲一個64位浮點數。 Example: 例&#xff1a; val decimal…

basic knowledge

Position 屬性&#xff1a;規定元素的定位類型。即元素脫離文檔流的布局&#xff0c;在頁面的任意位置顯示。 ①absolute &#xff1a;絕對定位&#xff1b;脫離文檔流的布局&#xff0c;遺留下來的空間由后面的元素填充。定位的起始位置為最近的父元素(postion不為static)&…

avatar.php uid,phpcms函數庫中獲取會員頭像方法get_memberavatar()有時無效問題

修復方法&#xff1a;首先我先給出無效情況的演示代碼&#xff0c;如下&#xff1a;$userid intval($_GET[userid]);$userinfo $this->db->get_one(userid.$userid);$this->db->set_model(10); //原因便在這里$userdetail $this->db->get_one("useri…

ruby 集合 分組_將Ruby中兩個集合的所有元素結合在一起

ruby 集合 分組In this program, we will see how we can combine the two sets? This is not a very difficult task. This can be easily done with the help of the operator. In many places of programming, you will find that operator is overloaded for various ty…

?Python中面向對象的編程

Python面向對象的編程1概述&#xff08;1&#xff09;面向對象編程面向對象的編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述&#xff0c;使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單&#xff0c;并且可以大大提高程序開發效率&a…

php中用for循環制作矩形,PHP中for循環語句的幾種變型

PHP中for循環語句的幾種變型2021-01-22 10:21:42406for語句可以說是PHP(同時也是多種語言)的循環控制部份最基本的一個語句了&#xff0c;for語句的執行規律和基礎用法在這里就不多說&#xff0c;可以參見PHP手冊for語句部分。PHP手冊中對它的語法定義如下&#xff1a;for(expr…