MongoDB中的分組

.MongoDB中的Count函數、Distinct函數以及分組

?準備工作,插入一個班級的文檔

> for(var i=0;i<10;i++){

... db.Classes.insert({ClassName:"Class"+i,_id:i});

... }

WriteResult({ "nInserted" : 1 })

> db.Classes.find()

{ "_id" : 0, "ClassName" : "Class0" }

{ "_id" : 1, "ClassName" : "Class1" }

{ "_id" : 2, "ClassName" : "Class2" }

{ "_id" : 3, "ClassName" : "Class3" }

{ "_id" : 4, "ClassName" : "Class4" }

{ "_id" : 5, "ClassName" : "Class5" }

{ "_id" : 6, "ClassName" : "Class6" }

{ "_id" : 7, "ClassName" : "Class7" }

{ "_id" : 8, "ClassName" : "Class8" }

{ "_id" : 9, "ClassName" : "Class9" }

>

?

1.count函數

如上面,如果要統計班級的數目,可以使用count函數進行統計

> db.Classes.find().count()

10

>

?

2.Distinct函數

修改一下Classes文檔,添加一條重復的數據

> db.Classes.insert({_id:10,ClassName:"Class9"})

WriteResult({ "nInserted" : 1 })

> db.Classes.find()

{ "_id" : 0, "ClassName" : "Class0" }

{ "_id" : 1, "ClassName" : "Class1" }

{ "_id" : 2, "ClassName" : "Class2" }

{ "_id" : 3, "ClassName" : "Class3" }

{ "_id" : 4, "ClassName" : "Class4" }

{ "_id" : 5, "ClassName" : "Class5" }

{ "_id" : 6, "ClassName" : "Class6" }

{ "_id" : 7, "ClassName" : "Class7" }

{ "_id" : 8, "ClassName" : "Class8" }

{ "_id" : 9, "ClassName" : "Class9" }

{ "_id" : 10, "ClassName" : "Class9" }

?

現在我想查詢所有ClassName,去掉重復的,可以執行下面的操作。

> db.runCommand({distinct:"Classes",key:"ClassName"}).values

[

??????? "Class0",

??????? "Class1",

??????? "Class2",

??????? "Class3",

??????? "Class4",

??????? "Class5",

??????? "Class6",

??????? "Class7",

??????? "Class8",

??????? "Class9"

]

>

去重語法 db.runCommand({distinct:"數據集合名字",key:"需要去重的鍵"}).values

?

3.Group分組操作(比較復雜)

語法:

db.runCommand({group:{

?????? ?ns:集合名字,

?Key:分組的鍵對象,

?Initial:初始化累加器,

?$reduce:組分解器,

?Condition:條件,

?Finalize:組完成器

????? }})

?

?1).key:用來分組文檔的字段。和keyf兩者必須有一個

?2).keyf:可以接受一個javascript函數。用來動態的確定分組文檔的字段。和key兩者必須有一個

?3).initial:reduce中使用變量的初始化

?4).reduce:執行的reduce函數。函數需要返回值。

?5).cond:執行過濾的條件。

?6).finallize:在reduce執行完成,結果集返回之前對結果集最終執行的函數。可選的。

?

具體的使用可以參考手冊:http://mongodb-documentation.readthedocs.org/en/latest/reference/command/group.html

分組首先會按照key進行分組,每組的 每一個文檔全要執行$reduce的方法,他接收2個參數一個是組內本條記錄,一個是累加器數據.

?

新建一個persons集合,插入一下數據

var persons = [{

name:"Tom",

age:25,

country:"USA"

},

{

name:"Jack",

age:25,

country:"USA"

},

{

name:"Lucy",

age:26,

country:"USA"

},

{

name:"DaChengzi",

age:27,

country:"China"

},

{

name:"Xiaojuz",

age:26,

country:"China"

},

{

name:"DaPingguo",

age:27,

country:"China"

},

{

name:"XiaoBoluo",

age:27,

country:"China"

},

{

name:"Bangzi1",

age:26,

country:"Korea"

},

{

name:"LiShishi",

age:27,

country:"Korea"

},

{

name:"Rain",

age:21,

country:"Korea"

},

{

name:"CangJingkong",

age:30,

country:"Japan"

}]

for(var i = 0;i<persons.length;i++){

db.persons.insert(persons[i])

}

插入完成后,查看一下:

?

現在我有一個需求,想要找到每個國家當中年紀最大的人,并且年紀不大于30歲,輸出他們的名字

?

思路: ①先按照國家進行分組

? ? ? ? ?②找到每個國家中年紀最小的

? ? ? ? ?③判斷年紀是不是小于30

?

編寫查詢:

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{age:0},

$reduce:function(doc,prev){

if(doc.age>prev.age){

prev.age=doc.age;

prev.name = doc.name;

prev.country = doc.country;

}

},

condition:{age:{$lt:30}}

}})

?

運行結果:

{

??????? "retval" : [

???????? {

????????????? "country" : "USA",

????????????? ?"age" : 26,

??????????????????????? "name" : "Lucy"

??????????????? },

??????????????? {

??????????????????????? "country" : "China",

??????????????????????? "age" : 27,

??????????????????????? "name" : "DaChengzi"

??????????????? },

??????????????? {

??????????????????????? "country" : "Korea",

??????????????????????? "age" : 27,

??????????????????????? "name" : "LiShishi"

??????????????? }

??????? ],

??????? "count" : 10,

??????? "keys" : 3,

??????? "ok" : 1

}

?

從結果看到日本女士蒼井空的年齡是30,被我篩選掉了…...

?

Finallize的使用,如果覺得返回的東西太過單調,可以使用finalize進行再次的修改

?

例如:

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{age:0},

$reduce:function(doc,prev){

if(doc.age>prev.age){

prev.age=doc.age;

prev.name = doc.name;

prev.country = doc.country;

}

},

finalize:function(prev){

prev.age = "Age is" +prev.age;

prev.name = "Name is " + prev.name;

prev.country = "Country is " + prev.country;

},

condition:{age:{$lt:30}}

}})

?

加上上面之后,查詢的結果如下:

{

??????? "retval" : [

??????????????? {

??????????????????????? "country" : "Country is USA",

??????????????????????? "age" : "Age is26",

??????????????????????? "name" : "Name is Lucy"

??????????????? },

??????????????? {

??????????????????????? "country" : "Country is China",

??????????????????????? "age" : "Age is27",

??????????????????????? "name" : "Name is DaChengzi"

??????????????? },

??????????????? {

??????????????????????? "country" : "Country is Korea",

??????????????????????? "age" : "Age is27",

??????????????????????? "name" : "Name is LiShishi"

??????????????? }

??????? ],

??????? "count" : 10,

??????? "keys" : 3,

??????? "ok" : 1

}

可以看到每一項數據前面,都加上了說明文字,所以說finialize是可以對分完組之后的數據在做一次修改的。

?

.命令執行器(db.runCommand())

1.之前我們遇到刪除集合,一般使用的方法是 db.集合名.drop()

使用命令執行器:

db.runCommand({drop:"集合"})

?

2.查找MongoDB為我們提供的命令

①在shell中執行:db.listCommands()

②訪問網址http://127.0.0.1:28017/_commands

?

3.常用命令

.固定集合(Capped Collection

1.解釋:就是固定size的集合唄。

2.特點:性能出色的有著固定大小的集合,以LRU(Least Recently Used最近最少使用)規則和插入順序進行age-out(老化移出)處理,自動維護集合中對象的插入順序,在創建時需要預先指定大小。如果空間用完,新添加的對象將會取代集合中最舊的對象永遠保持最新的數據

總結就是以下:

①固定集合默認是沒有索引的就算是_id也是沒有索引的

②由于不需分配新的空間他的插入速度是非常快的

③固定集合的順是確定的導致查詢速度是非常快的

④最適合的是應用就是日志管理

3.使用

①創建一個固定集合

? 創建一個新的固定集合要求大小是100個字節,可以存儲文檔10

?> db.createCollection("myCapped",{size:100,capped:true,max:10})

??? { "ok" : 1 }

?>

?

②把一個普通集合轉成固定集合

> db.runCommand({convertToCapped:"Classes",size:100000})

{ "ok" : 1 }

>

?

③插入數據

文檔最大為10個,那么當插入11條數據的時候,會出現什么情況呢,根據之前的概念,應該是吧第一條數據踢出去,然后加入最后一條

> for(var i = 0; i<11;i++){

... db.myCapped.insert({name:"name"+i,_id:i})

... }

WriteResult({ "nInserted" : 1 })

> db.myCapped.find()

{ "_id" : 1, "name" : "name1" }

{ "_id" : 2, "name" : "name2" }

{ "_id" : 3, "name" : "name3" }

{ "_id" : 4, "name" : "name4" }

{ "_id" : 5, "name" : "name5" }

{ "_id" : 6, "name" : "name6" }

{ "_id" : 7, "name" : "name7" }

{ "_id" : 8, "name" : "name8" }

{ "_id" : 9, "name" : "name9" }

{ "_id" : 10, "name" : "name10" }

>

> db.myCapped.insert({name:"name11",_id:11})

WriteResult({ "nInserted" : 1 })

> db.myCapped.find()

{ "_id" : 2, "name" : "name2" }

{ "_id" : 3, "name" : "name3" }

{ "_id" : 4, "name" : "name4" }

{ "_id" : 5, "name" : "name5" }

{ "_id" : 6, "name" : "name6" }

{ "_id" : 7, "name" : "name7" }

{ "_id" : 8, "name" : "name8" }

{ "_id" : 9, "name" : "name9" }

{ "_id" : 10, "name" : "name10" }

{ "_id" : 11, "name" : "name11" }

>

④刪除數據

> db.myCapped.remove({_id:11})

WriteResult({

??????? "nRemoved" : 0,

??????? "writeError" : {

??????????????? "code" : 10101,

??????????????? "errmsg" : "cannot remove from a capped collection: mongoDBTest.myCapped"

??????? }

})

>

如上例,固定集合是不能進行數據刪除的。

綜上:固定集合有點像一個隊列,先進先出,大小不變。

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/dcz2015/p/5314273.html

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

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

相關文章

在 .NET 6 項目中使用 Startup.cs

對于 .NET 6 項目&#xff0c;現在已經找不到 Startup.cs 文件。默認情況下&#xff0c;此文件已經被刪除&#xff0c;并且 Program.cs 是配置依賴注入服務和 Middleware 的新位置。但是&#xff0c;有些人可能更喜歡使用 Startup.cs , 并且我也是&#xff0c;可能已經習慣了&a…

編寫iptables腳本實現IP地址、端口過濾

實驗案例&#xff1a;公司使用一臺運行RHEL5系統的服務器作為網關&#xff0c;分別連接三個網絡&#xff0c;其中LAN1為普通員工電腦所在的局域網&#xff0c;LAN2為DNS緩存服務器所在的局域網。eth0通過10M光纖接入Internet。為了有效的管理網絡環境及增強內部網絡的安全性&am…

讓VS Code 支持 Jupyter Notebook

一、Jupyter Notebook Jupyter Notebook是基于網頁的用于交互計算的應用程序。其可被應用于全過程計算&#xff1a;開發、文檔編寫、運行代碼和展示結果。——Jupyter Notebook官方介紹。 Jupyter Notebook是以網頁的形式打開&#xff0c;可以在網頁頁面中直接編寫代碼和運行代…

C語言試題128之對 10 個數進行排序

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:對 10 個數進行排序 分析:可以利用選擇法,即從后 9 個比較過程中,選擇一個最小的與…

JavaScript設計模式

JavaScript的設計模式&#xff1a; 1、單例模式 單例模式&#xff08;Singleton&#xff09;&#xff0c;整個運行期間只會被初始化一次。該模式簡單易懂&#xff0c;運用也很廣泛。可以用它來聚合公共的方法&#xff0c;形成一個工具類&#xff0c;對外提供api。 var single …

Windows 11 23H2 25145 推送!全新隱私設置和 OneDrive 體驗

面向 Dev 頻道的 Windows 預覽體驗成員&#xff0c;微軟現已推送 Windows 11 預覽版 Build 25145。主要變化1.微軟宣布為 Windows 11 設置引入全新 OneDrive 體驗&#xff0c;您可以在設置中查看 OneDrive 云存儲服務的訂閱詳情&#xff0c;包括付費方式、容量大小和定期付費等…

你不知道的無人機知識(建議收藏)

文章目錄 無人機簡介無人機的分類按用途分類按飛行平臺構型分類按大小分類按飛行性能分類你絕對沒有見過的無人機真三維模型 無人機簡介 無人駕駛飛機簡稱“無人機”,英文縮寫為“UAV”,是利用無線電遙控設備和自備的程序控制裝置操縱的不載人飛機,或者由車載計算機完全地或…

用jekyll制作高大上的網站(二)——實際應用

最近公司要制作個文檔庫&#xff0c;直接就可以將jekyll應用到實際中。 模版使用了Jekyll Clean&#xff0c;這么模版相對內部簡單一點&#xff0c;學習成本不會很大&#xff0c;而復雜的Minimal Mistakes就當作參考。 模版使用的CSS是Bootstrap v3.2.0版本的。為了省時點&…

Python腳本模擬登錄網頁之CSDN篇

1. 通過Firefox配合插件Tamper Date獲取登錄時客戶端向服務器端提交的數據, 并且發現lt和execution這兩個字段每次登錄時都不一樣. POSTDATAusernameyour_id&passwordyour_pwd&ltLT-239317-XyzqoketZ2AhHE5BSIKLwW7gNyb4sP&executione2s1&_eventIdsubmit 2. 于…

C語言試題129之求一個 3乘3 矩陣對角線元素之和

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:求一個 3乘3 矩陣對角線元素之和 分析:利用雙重 for 循環控制輸入二維數組,再將 a[…

ssh key生成

Mac電腦用終端生成SSH key 訪問自己的Github 字數684 閱讀427 評論4 喜歡15前言&#xff1a;最近有不少剛剛使用github管理代碼的開發者或者新手碼農在網上 問我如何關聯自己的github&#xff0c;今天就寫篇文章僅供參考。一、首先你要檢測自己電腦是否存在 SSH key 在終端輸出…

[轉]小白都能看懂的softmax詳解

1.softmax初探 在機器學習尤其是深度學習中&#xff0c;softmax是個非常常用而且比較重要的函數&#xff0c;尤其在多分類的場景中使用廣泛。他把一些輸入映射為0-1之間的實數&#xff0c;并且歸一化保證和為1&#xff0c;因此多分類的概率之和也剛好為1。 首先我們簡單來看看s…

MAUI 入門教程系列(5.XAML及頁面介紹)

前言作為微軟的UI框架&#xff0c;除了Winform以外&#xff0c;多數是以創建XAML文件的方式來編寫前端的頁面&#xff0c;盡管你也可以通過C#代碼來編寫你的用戶界面&#xff0c;與Xamarin.Forms相同&#xff0c;在MAUI上編寫XAML的聲明方式與其相同&#xff0c;重構了底層部分…

藍牙mesh網絡基礎

藍牙mesh網絡基礎轉載于:https://blog.51cto.com/11534544/2044130

Linux系統開機自啟流程

第一步&#xff1a;POST&#xff08;Power On Safe Test&#xff09;加電自檢當按下電源鍵以后&#xff0c;CPU因為有電流通過便開始對自身、I/O設備、內存等硬件進行檢驗。那么CPU如何得知這些自檢指令&#xff1f;我們知道指令存在于內存當中&#xff0c;尋找內存也需要指令。…

ArcGIS空間數據:矢量和柵格數據結構詳解

文章目錄 矢量數據結構矢量數據簡介Shapefile矢量格式柵格數據結構地理數據庫中的柵格柵格管理策略柵格數據的地理屬性柵格的地理屬性通常包括地理數據集中的柵格塊表實體柵格表示矢量數據結構 矢量數據簡介 基于矢量數據模型的數據結構簡稱矢量數據結構,是通過記錄實體坐標…

C語言試題130之有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 題目:有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中 分析:先判…

[轉]一文讀懂目標檢測:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/kwame211/article/details/88016151 一、目標檢測常見算法 object detection&#xff0c;就是在給定的圖片中精確找到物體所在位置&#xff0c;并標注出物體的類別。所以&a…

在代碼中使用度量單位,從而生活更美好

在我們的應用軟件中&#xff0c;涉及到物理化學計算時&#xff0c;只有 Frink 、F#、Modelica 少數語言變量是自帶單位的&#xff0c;大部分語言變量僅包含數值&#xff0c;單位轉換需要在變量進行公式計算之前完成&#xff0c;計算后再把結果單位轉換為輸出單位&#xff0c;單…

C#(Sharp)進階篇:文件操作

文章目錄 8.1 文件系統概述8.2 驅動器、目錄和文件8.2.1 與IO操作相關的枚舉8.2.2 驅動器8.2.3 目錄8.2.4 文件8.3 文件流和數據流8.3.1 抽象類Stream8.3.2 文件流FileStream8.3.3 流的文本讀寫器8.3.4 流的二進制讀寫器8.3.5 常用的其他流對象8.4 應用實例8.1 文件系統概述