mongod小結(jié)

文檔和集合

文檔

文檔是Mongodb中的最基本數(shù)據(jù)單元,類似于關(guān)系數(shù)據(jù)庫中的行。

在mongodb中,文檔的鍵通常都是字符串口渔。Mongodb對文檔的鍵是區(qū)分大小寫的,對鍵值是區(qū)分數(shù)據(jù)類型的

例如:

{username:”admin”}和{userName:”admin”}? {age:20}和{age:”20”}是不同的文檔

特別注意:{username:”admin”,username:”非法鍵”}穿撮,同一文檔中 鍵值是不能重復(fù)的缺脉。


集合

集合是文檔組成的,在關(guān)系型數(shù)據(jù)庫中就是表悦穿。

在mongodb中攻礼,對集合中存儲的文檔是非常開放的,一個集合中可以存放各式各樣的文檔栗柒。

例如:

{username:”admin”} , {role:”admin”} (強烈反對)

{username:”admin”},{username:”pp”} (強烈推薦)


子集合

? 組織子集合的一種慣例是使用“.”字符分開的按命名空間劃分的子集合秘蛔。在MongoDB中使用子集合來組織數(shù)據(jù)是很好的方法。

例如:

? 用戶與用戶詳細信息包含兩個集合傍衡,分別是user.user和user.userinfo深员。這樣做的目的只是為了使組織結(jié)構(gòu)更好些,也就是說 user這個集合(這里根本就不需要存在)及其子集合沒有任何關(guān)系蛙埂。把數(shù)據(jù)庫的名字放到集合名前面倦畅,得到就是集合的完全限定名,稱為命名空間绣的。


數(shù)據(jù)庫

admin

? 從權(quán)限的角度來看叠赐,這是“root”數(shù)據(jù)庫。要是將一個用戶添加到這個數(shù)據(jù)庫屡江,這個用戶自動繼承所有數(shù)據(jù)庫的權(quán)限芭概。一些特定的服務(wù)器端命令也只能從這個數(shù)據(jù)庫運行,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器惩嘉。

local

這個數(shù)據(jù)永遠不會被復(fù)制罢洲,可以用來存儲限于本地單臺服務(wù)器的任意集合

config

當Mongo用于分片設(shè)置時,config數(shù)據(jù)庫在內(nèi)部使用文黎,用于保存分片的相關(guān)信息惹苗。

命名規(guī)則

1、不能是“”空字符串

2耸峭、不可以含有空格桩蓉,在mongodb中 空格代表結(jié)束字符。

3劳闹、文檔的鍵不可以有“.”和“$”符號院究,集合名中不可以包含“$”

4洽瞬、集合不能以 “system.”開頭,mongodb中system是系統(tǒng)保留前綴

5业汰、集合名長度不得超過121字節(jié)片任,在實際使用當中應(yīng)該小于100字節(jié);數(shù)據(jù)庫名最多不超過64個字節(jié)

(mongodb最終是以文件方式存儲的蔬胯,操作系統(tǒng)中的非法文件名,在mongodb中就是非法的位他,這樣便于理解與記憶)

數(shù)據(jù)類型

? ? MongoDB的文件存儲格式為BSON,同JSON一樣支持往其它文檔對象和數(shù)組中再插入文檔對象和數(shù)組氛濒,同時擴展了JSON的數(shù)據(jù)類型.與數(shù)據(jù)庫打交 道的那些應(yīng)用。

String? ? ? ? ? ? ? ? ? ? 字符串鹅髓。存儲數(shù)據(jù)常用的數(shù)據(jù)類型舞竿。在 MongoDB 中,UTF-8 編碼的字符串才是合法的窿冯。

Integer? ? ? ? ? ? ? ? ? 整型數(shù)值骗奖。用于存儲數(shù)值。根據(jù)你所采用的服務(wù)器醒串,可分為 32 位或 64 位执桌。

Boolean? ? ? ? ? ? ? ? 布爾值。用于存儲布爾值(真/假)芜赌。

Double? ? ? ? ? ? ? ? ? 雙精度浮點值仰挣。用于存儲浮點值。

Array? ? ? ? ? ? ? ? ? ? ?用于將數(shù)組或列表或多個值存儲為一個鍵缠沈。

Timestamp? ? ? ? ? ? 時間戳膘壶。記錄文檔修改或添加的具體時間。

Object? ? ? ? ? ? ? ? ? ?用于嵌入式的文檔洲愤,即一個值為一個文檔

Null? ? ? ? ? ? ? ? ? ? ? ?用于創(chuàng)建空值颓芭。

Date? ? ? ? ? ? ? ? ? ? ? 日期時間。用 UNIX 時間格式來存儲當前日期或時間柬赐。你可以指定自己的日期時間:創(chuàng)建 Date 對象亡问,傳入年月日信息。

Object ID? ? ? ? ? ? ? ?對象 ID肛宋。用于創(chuàng)建文檔的 ID玛界。

Binary Data? ? ? ? ? ?二進制數(shù)據(jù)。用于存儲二進制數(shù)據(jù)悼吱。

insert

db.集合名稱.insert(document)

這個操作是向mydb.user集合中增加“_id”建慎框,并添加到MongoDB中。檢驗是否含有“_id”鍵和文檔不超過16M后添,除之笨枯,不做任何數(shù)據(jù)驗證。


save

db.mydb.save({name:”test2”})

這個操作也是向mydb.user集合中增加“_id”建,并添加到MongoDB中馅精。save函數(shù)實際就是根據(jù)參數(shù)條件,調(diào)用了insert或update函數(shù).如果想插入的數(shù)據(jù)對象存在,insert函數(shù)會報錯,而save函數(shù)是改變原來的對象;如果想插入的對象不存在,那么它們執(zhí)行相同的插入操作.這里可以用幾個字來概括它們兩的區(qū)別,即所謂"有則改之,無則加之".


update

1. db.mydb.user.update({name:”test1”} , {name:”test1”,age:20})

2. 使用findOne()函數(shù): user=db.mydb.user.findOne({name:”test1”})

user.name=“test1”

user.age++

db.mydb.user.update({_id:user._id},user)


修改器

$inc修改器

update({鍵:值},{$inc:{鍵:值}})

db.mydb.user.update({users:"dsm"},{$inc:{age:1}})

age自增1(age必須為數(shù)字類型)


$set修改器

update({鍵:值},{$set:{鍵:值}})

set為該文檔設(shè)置一條屬性严嗜,如果沒有則創(chuàng)建一條屬性

db.mydb.user.update({users:"dsm"},{$set:{hobby:"皮"}})

也可以修改內(nèi)嵌文檔

db.mydb.user.update({users:"dsm"},{$set:{"skills.name":["正方形打野","邊緣OB","假設(shè)性原則"]}})

db.mydb.user.update({users:"dsm"},{$set:{"skills.發(fā)動結(jié)果":["隊友崩盤","永不團滅","馬半仙模式"]}})

修改內(nèi)嵌文檔不同于修改屬性,不會覆蓋洲敢。


$unset修改器

? ? update({鍵:值},{$unset:{鍵:-1/0/1}})

? ? -1/0/1都表示刪除

刪除該文檔的一條屬性

db.mydb.user.update({users:"dsm"},{$unset:{"skills.基地爆炸":-1}})


$push數(shù)組修改器

? update({…},{$push:{鍵:值}})?

? $push修改器是會往鍵已有的數(shù)組中追加值漫玄,如果數(shù)組不存在,則創(chuàng)建新的數(shù)組并更新鍵值压彭。

? db.mydb.user.update({users:"dsm"},{$push:{hobby:"養(yǎng)大象"}})


$push + $ne數(shù)組修改器

update({鍵:{$ne:值}},{$push:{鍵:值}})

$push+$ne 組合鍵使用于如果追加值不在數(shù)組中則追加進去睦优。

db.mydb.user.update({users:"dsm",hobby:{$ne:"折磨王"}},{$push:{hobby:"折磨王"}})


addToSet數(shù)組修改器

update({…},{$addToSet:{鍵:值}})

相當于$push+$ne

db.mydb.user.update({users:"dsm"},{$addToSet:{hobby:"折磨王"}})

db.mydb.user.update({users:"dsm"},{$addToSet:{hobby:"拳皇"}})


$addToSet + $each數(shù)組修改器

update({…},{$addToSet:{鍵:{$each:[…]}}})

當我們一次要追加多個值得時候,而且需要判斷數(shù)組中是否存在壮不,這時$push+$ne 組合就不能實現(xiàn)了汗盘,需求用到$addToSet+$each組合鍵。

db.mydb.user.update({users:"dsm"},{$addToSet:{hobby:{$each:["馬氏跑動殺","葵花三式","折磨王"]}}})

只加入了馬氏跑動殺和葵花三式询一,折磨王沒有加入


$pop數(shù)組修改器

{$pop:{鍵:1}}? - 從數(shù)組尾部刪除一個元素

{$pop:{鍵:-1}} - 從數(shù)組頭部刪除一個元素

“$pop”修改器用于刪除數(shù)組里面值隐孽,如果把數(shù)組看成一個隊列或者棧的話,可以從數(shù)組任何一端刪除元素健蕊。

db.mydb.user.update({users:"dsm"},{$pop:{hobby:1}})


$pull數(shù)組修改器

{$pull:{鍵:值}}

“$pull”修改器也是用于刪除數(shù)組里面值菱阵,它可以刪除數(shù)組中任意位置的值,并且刪除所有匹配到的值

db.mydb.user.update({users:"dsm"},{$pull:{hobby:"折磨王"}})


$定位修改器

“$”定位修改器也是用于數(shù)組里面值的數(shù)據(jù)類型為內(nèi)嵌文檔缩功,可以使用$實行定位修改送粱。

db.mydb.user.update({users:"dsm"},{$set:{"skills.name":["蕭峰","胡里亞","馬化騰"]}})

db.mydb.user.update({"skills.test" :11},{$set:{"skills.name":["跑之小跳"]}})


upsert

update({匹配文檔},{更新文檔},true)

Upsert 可以理解為 update與insert的縮寫 ,它是update函數(shù)的第三個參數(shù)掂之,其實際含義就是更新或插入抗俄。

Update參數(shù)upsert默認值是fasle,它是一種特殊的更新。根據(jù)這個參數(shù)值世舰,update函數(shù)判斷對匹配不到的文檔动雹,將更新文檔基于匹配文檔之上以一個新的文檔是否增加到集合中。

db.mydb.user.update({users:"pdd"},{users:"pddd"},true)


mutli

update({…},{…}, false, true)

它是update函數(shù)的第四個參數(shù)跟压,其實際含義就是是否實現(xiàn)多更新操作胰蝠。

update函數(shù)的mutli默認值是false, 代表只對第一個匹配到的文檔進行更新操作;需要更新多個符合匹配條件的文檔震蒋,則要設(shè)置mutli值為true.

例如:所有名稱為test3的年齡加2

db.mydb.user.update({name:”test3”},{$inc:{age:2}, false, true})

db.runCommand({getLastError:1})可以查看受影響的文檔數(shù)


返回更新文檔

用法:db.集合名.findAndModify({

? ? query:{匹配文檔},

? ? update:{更新文檔}

? ? [,remove:布爾值茸塞,sort:{排序文檔},new:布爾值]

? ? })

? ? query: 匹配文檔,也就是查詢條件

? ? sort:? 排序匹配文檔的條件

? ? update: 修改器文檔查剖,執(zhí)行文檔更新操作

? ? remove: true/false,是否對匹配到的文檔進行刪除

? ? new: true/false, 表示返回的是更新前還是更新后的文檔钾虐,默認值是false

update 與remove 必須而且只能存在一個。

它一次只能操作一個文檔笋庄,不能進行upsert操作,只能更新已存在的文檔效扫。

findAndModify 執(zhí)行效率有點低倔监,話雖這么說,不代表避免使用菌仁,mongo每一個函數(shù)的存在浩习,都有其實際存在的價值。它的執(zhí)行效率相當于 一次查詢济丘、更新外加getLastError 順序執(zhí)行的時間谱秽。

db.mydb.user.findAndModify({query:{users:"dsm"},update:{$pop:{hobby:1}}})


安全操作

? ? mongoDB 開發(fā)者采用不安全模式作為默認選擇,這是由于他們與關(guān)系型數(shù)據(jù)庫打交道的經(jīng)驗所致的摹迷,很多構(gòu)建在關(guān)系型數(shù)據(jù)庫的應(yīng)用疟赊,都不關(guān)心返回的代碼,也不會處理這個返回碼泪掀,但又得苦苦等待這個返回碼,這會造成性能極大的下降颂碘。mongoDB可以讓用戶來選擇采用何種方式异赫。有些操作可以使用不安全模式(速度快),有些操作使用安全模式头岔。

? ? 安全操作是在執(zhí)行完操作后立即執(zhí)行g(shù)etLastError命令塔拳,來檢查是否成功執(zhí)行。然后適當?shù)奶幚頂?shù)據(jù)庫返回的錯誤峡竣,一般情況下數(shù)據(jù)庫會拋出一個可捕獲的錯誤靠抑,我們可以采用自己的開發(fā)語言來捕獲和處理。如果執(zhí)行成功适掰,getLastError會給出額外的信息作為響應(yīng)(比如:更新或刪除操作給出的更新數(shù))颂碧。


請求和連接

? ? 數(shù)據(jù)庫會為每個mongoDB連接創(chuàng)建一個獨立的隊列,來存放連接的請求类浪,當客戶端發(fā)送請求载城,會被存放到該連接隊列的末尾,當隊列的請求都執(zhí)行完畢后费就,才會執(zhí)行后續(xù)的請求诉瓦。對于實際應(yīng)用的交錯插入、查詢力细,會產(chǎn)生秒級的延遲睬澡。


查詢

查詢 find

查詢就是返回一個集合中文檔的子集,子集合的范圍從0個文檔到整個集合眠蚂。

例如:

db.mydb.user.find({name:”test1”})


指定返回值

有時并不需要返回文檔中的所有鍵和值煞聪,遇到這樣的情況,使用find 的第二個參數(shù)來指定返回鍵逝慧,這樣做既可以節(jié)省傳輸?shù)臄?shù)據(jù)量米绕,也可以節(jié)省客戶端解碼文檔的時間和內(nèi)存開銷瑟捣。

例如: db.mydb.user.find({},{age:1,_id:0})

1代表顯示栅干,0代表不顯示


限制

查詢還是有些限制的迈套,數(shù)據(jù)庫所關(guān)心的查詢文檔的值必須是常量,也就是所不可以使用文檔的其他鍵值


條件查詢

查詢條件

類型 描述 舉例

< $t (小于) db.mydb.user.find({age:{$lt:35}})

<=$lte (小于等于) db.mydb.user.find({age:{$lte:35}})

> $gt (大于) db.mydb.user.find({age:{$gt:31}})

>=$gte (大于等于) db.mydb.user.find({age:{$gte:31}})

≠$ne (不等于) db.mydb.user.find({name:{$ne:”test3”}})

模糊查詢 /^…/ db.mydb.user.find({name:/^test/})

$OR和$not查詢

$in 用來查詢一個鍵的多個值 相對的是$nin

db.mydb.user.find({users:{$in:["dsm","pddd"]}})

db.mydb.user.find({users:{$nin:["dsm","pddd"]}})

$or:比$in更通用一些碱鳞,是用來查詢多個鍵的任意給定鍵值,其值是一個數(shù)組形式

db.mydb.user.find({$or:[{users:"dsm"},{name:"aaa"}]})

db.mydb.user.find({$or:[{users:{$in:["dsm","pddd"]}},{name:"aaa"}]})

$not是元條件句桑李,就是可以用在任意的其他查詢條件上。

$not:是用來查詢與特定模式不相符的文檔窿给。

db.mydb.user.find({age:{$not:{$mod:[5,0]}}})

$not 與正值表達是聯(lián)合使用的時候極為有用贵白。


條件句規(guī)則

在查詢中,類似$lt的鍵處在內(nèi)層文檔崩泡,如修改器$inc則處在外層文檔禁荒。

如:{age:{$lt:30}} 與? {$inc:{age:1}}

而且一個鍵可以含有多個條件,但不可以含有多個修改器:

{age:{$lt:30,$gt:20}}? √? ?

{$inc:{age:1},$set:{age:40}}? × 不能在同一行修改同一個對age的修改


數(shù)組查詢

$all

對于數(shù)組查詢中角撞,多個元素的匹配時呛伴,需要用到關(guān)鍵鍵$all. 如下:

db.mydb.insert({shop:”B”,fruit:[“apple”,” peach”,”orange”],size:3})

db.mydb.insert({shop:”C”,fruit:[“mango”,”banana”,” apple”],size:3})

查詢既有”apple”又有”banana”的文檔:

db.mydb.find({fruit:{$all:[“apple”,”banana”]}})

注:$all 查詢不考慮鍵值的先后順序問題谒所。


精確匹配

使用[ ]精確匹配數(shù)組元素热康,既要考慮鍵值的個數(shù),也要考慮元素位置:

db.mydb.find({fruit:[“apple”,”banana”,”orange”]})


下標查詢

Key: 代表鍵劣领。

Index:代表數(shù)組下標姐军。

數(shù)組鍵值下標是從0開始。如下:

db.mydb.find({“fruit.1”:“banana”})

查詢數(shù)組中第二的元素為“banana”的文檔尖淘。


$size

在數(shù)組查詢中奕锌,$size的查詢意義非凡,顧名思義村生,該鍵就是查詢指定長度的數(shù)組歇攻。

如:db.mydb.find({fruit:{$size:3}})

但是很不幸的是,它不可以與其他查詢子句組合使用(”$lt“梆造、”$gt“);

如:db.mydb.find({fruit:{$size:{$gt:3}}})? 是非法的缴守。

但是這種查詢可以通過在文檔中增加一個size鍵來實現(xiàn)。

如:db.mydb.update({shop:”A”},{“$push”:{fruit:“Watermelon”},$inc:{size:1}})

db.mydb.find({size:{“$lt”:4}})


$slice

$slice 是用于子集查詢镇辉,其返回值是一個子集合屡穗。如:

db.mydb.find({shop:”A”},{fruit:{$slice:2}})

上面查詢表示查詢數(shù)組的前2個子集。

也可以返回后2個子集:

db.mydb.find({shop:”A”},{fruit:{$slice:-2}})

它也可以接受偏移量[m,n]:

db.mydb.find({shop:”A”},{fruit:{$slice:[1,2]}})

表示跳過第一個,查詢2個子集忽肛。


內(nèi)嵌文檔查詢

單個內(nèi)嵌文檔

db.mydb.km.find({“person.name”:”zhangsan”,”person.age”:25})

這種點的查詢方式就是區(qū)別于其他普通文檔的主要特點村砂,而且為什么對于鍵名不能使用.這個符號做出了最好的詮釋。

注:鍵值匹配查詢屹逛,對于內(nèi)嵌文檔值多個或者順序未知的情況下础废,是有效的汛骂。


復(fù)雜內(nèi)嵌文檔

$where查詢

需求:查詢apple和banana值相等的文檔。(就是如何匹配鍵值相等评腺?)

普通查詢是滿足不了的帘瞭。Mongo也沒有提供這樣的$關(guān)鍵鍵。只能通過$where表達式來執(zhí)行:

db.mydb.fruit.find({“$where”:function(){

? ? ? if(this.apple==this.banana) return true;

? ? ? return false;

}})

等價db.mydb.fruit.find({“$where”:”this.apple==this.banana”})

$where 查詢其返回值是表達式返回reture的當前文檔蒿讥。

優(yōu)點:就是由于它可以使用javascript表達式,可想而知芋绸,查詢非常靈活媒殉、多樣廷蓉。

缺點:使用$where查詢给猾,比起普通的查詢速度要慢的多。因為其查詢原理是將被查詢文檔轉(zhuǎn)化成javacript對象恒削,然后通過$where表達式去比較池颈,而且還不能使用索引。所以不到萬不得已盡量避免使用$where查詢钓丰。


limit躯砰、skip和sort 使用

limit

limit 是限制返回結(jié)果集的數(shù)量,在find函數(shù)后使用該函數(shù)携丁。

limit(number): 返回匹配number個文檔琢歇。這里的number是上限料仗,不是下限宵晚。

例如:

db.mydb.fruit.find().limit(3) // 返回匹配到的3個文檔

如果結(jié)果少于3個,則全部返回知押。


skip

skip 類似于limit肥橙,區(qū)別在于:

skip(number): 略過匹配到的前number個文檔魄宏,返回剩下的文檔。

例如:

db.mydb.fruit.find().skip(3)? //略過匹配到的前3個文檔存筏,返回余下的所有文檔宠互。

如果結(jié)果少于3個味榛,則返回空。


sort

sort 是排序函數(shù)予跌,它的參數(shù)一個文檔對象(鍵搏色、值),鍵是集合中的鍵匕得,值是1或-1继榆;

1 代表升序;-1 代表降序汁掠。

例如:

db.mydb.fruit.find().sort({apple:1,banana:-1})

由于文檔型數(shù)據(jù)庫的數(shù)據(jù)類型是不規(guī)則的略吨,但mongo預(yù)定義了數(shù)據(jù)類型的排序規(guī)則。如:{a:[1,2]} 考阱、{a:true}

從小到大 :

1翠忠、最小值? ? ? ? ? ? ? ? ? 7、二進制? ? ? ? ? ? ? ? ? ? 13乞榨、最大值

2秽之、null? ? ? ? ? ? ? ? ? ? ? 8、對象ID

3吃既、數(shù)字? ? ? ? ? ? ? ? ? ? ? 9考榨、布爾型

4、字符串? ? ? ? ? ? ? ? ? 10鹦倚、日期

5河质、文檔? ? ? ? ? ? ? ? ? ? ? 11、時間戳

6震叙、數(shù)組? ? ? ? ? ? ? ? ? ? ? 12掀鹅、正則表達式

實際開發(fā)中,三個函數(shù)組合使用的情況比較多媒楼。

例如(分頁:第一頁):

? db.mydb.fruit.find().limit(20).sort({apple:1})

第二頁:

? db.mydb.fruit.find().limit(20).skip(20).sort({apple:1})


隨機抽取文檔

方法一

在實際應(yīng)用中乐尊,隨機抽取一個或多個文檔是非常常見的需求,在mongo中實現(xiàn)起來有點繁瑣:

最簡單的實現(xiàn)方法:

先計算出一個從0到記錄總數(shù)之間的隨機數(shù)划址,然后采用skip(隨機數(shù))方法 扔嵌。

var total=db.mydb.fruit.count();

var random=Math.floor(Math.random()*total);

? db.mydb.fruit.find().skip(random).limit(1);


方法二

當數(shù)據(jù)量很大時,skip操作會變的很慢夺颤,應(yīng)該避免使用skip來跳過大量的數(shù)據(jù) 痢缎。

可以采用另一種查詢方式:

為每一條記錄增設(shè)random字段,并賦值為Math.random()拂共,查詢時采用$gte和$lte牺弄。

db.mydb.fruit.update({banana:1},{$set:{random: Math.random()}})

var rand=Math.random();

db.mydb.fruit.find({random:{$gte:rand}});


方法三

高大上:借助Mongodb對地理空間索引(geospatial indexes)的支持,從而可以在上一個方法的基礎(chǔ)上來實現(xiàn)隨機記錄的獲取宜狐。

創(chuàng)建地理空間索引

db.mydb.fruit.ensureIndex({random:”2d”})

db.mydb.fruit.update({banana:1},{random:[Math.random,0]})

db. mydb.fruit.find ({random: { $near: [Math.random(), 0] } })


null

在查詢中势告,null有點奇怪蛇捌,它不僅可以匹配鍵值為null的文檔,而且還可以匹配“不存在”的鍵咱台。

如果僅僅想要匹配鍵值為null的文檔络拌,既要判斷該鍵值是否為null,還有通過“$exists”判斷該鍵是否存在。

例如:

db.mydb.test.find({z:{$in:[null],$exist:true}})


正則表達式

正值表達式能更靈活有效的匹配字符串回溺。MongoDB使用Perl兼容的正值表達式(PCRE)庫來匹配正值表達式春贸,PCRE所支持的正值表達式都能被MongoDB接受。正值表達式也可以匹配自身遗遵。

例如:

{name:/jack/}? ? 全匹配

{name:/jack/i}? 忽略大小寫

{name:/jac?/i}? 相似匹配

{name:/^ja/}? ? 模糊查詢


聚合查詢

count

? ? 最簡單的聚合查詢就是count查詢萍恕,它的查詢方式跟find是一樣的,但是返回值不一樣车要。Find 返回值是文檔集允粤,count 返回值是文檔數(shù)。

? 例如:

? db.mydb.fruit.count()? ? ->查詢文檔總數(shù)

? db.mydb.fruit.count({banana:1}) ->查詢限定文檔總數(shù)


distinct

distinct 是鍵值去重翼岁。其返回值是一個數(shù)組类垫。

用法:

db.mydb.fruit.distinct(“鍵”[,查詢條件])

如:

db.mydb.fruit.distinct(“apple”)

db.mydb.fruit.distinct(“apple”,{banana:1})


group

在mongodb里面做group操作有點小復(fù)雜,利用group可以將集合中的記錄按一個或多個鍵分組,然后可以聚合每個分組內(nèi)的文檔產(chǎn)生新的結(jié)果琅坡。

用法:db.mydb.fruit.group({‘key’:{},'$reduce':function(doc,prev){},'initial':{}})?

key:分組的鍵悉患;

initial:累加器初始值,分組之后榆俺,每一組的reduce函數(shù)會調(diào)用這個初始文檔售躁,并在組內(nèi)傳遞累加器;

$reduce:分組處理函數(shù)谴仙,分組之后會對每組元素遍歷處理迂求,該函數(shù)兩個參數(shù)碾盐,第一個參數(shù)是當前的文檔對象和第二個參數(shù)是上一次function操作的累計對象晃跺;

結(jié)果返回值為文檔數(shù)組:

[{分組鍵,累加器}]

例如:

db.mydb.fruit.db.group({key:{apple:1},$reduce:function(doc,pre){

? ? pre.bananaArr.push(doc.banana)

},initial:{bananaArr:[]}})

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毫玖,一起剝皮案震驚了整個濱河市掀虎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌付枫,老刑警劉巖烹玉,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阐滩,居然都是意外死亡二打,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門掂榔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來继效,“玉大人症杏,你說我怎么就攤上這事∪鹦牛” “怎么了厉颤?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凡简。 經(jīng)常有香客問我逼友,道長,這世上最難降的妖魔是什么秤涩? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任帜乞,我火速辦了婚禮,結(jié)果婚禮上筐眷,老公的妹妹穿的比我還像新娘挖函。我一直安慰自己,他們只是感情好浊竟,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布怨喘。 她就那樣靜靜地躺著,像睡著了一般振定。 火紅的嫁衣襯著肌膚如雪必怜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天后频,我揣著相機與錄音梳庆,去河邊找鬼。 笑死卑惜,一個胖子當著我的面吹牛膏执,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播露久,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼更米,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毫痕?” 一聲冷哼從身側(cè)響起征峦,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎消请,沒想到半個月后栏笆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡臊泰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年蛉加,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡针饥,死狀恐怖祟偷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情打厘,我是刑警寧澤修肠,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站户盯,受9級特大地震影響嵌施,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜莽鸭,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一吗伤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硫眨,春花似錦足淆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姥闭,卻和暖如春丹鸿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棚品。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工靠欢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铜跑。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓门怪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锅纺。 傳聞我的和親對象是個殘疾皇子掷空,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 目錄 查詢操作 集合查詢方法 find() 查詢內(nèi)嵌文檔 查詢操作符(內(nèi)含 數(shù)組查詢) "$gt" 、"$gte"...
    彩虹之夢閱讀 1,016評論 0 1
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,914評論 2 89
  • 1伞广、 數(shù)據(jù)庫基礎(chǔ)命令 use mydb(建立數(shù)據(jù)庫):use不僅可以進入一個數(shù)據(jù)庫拣帽,如果你敲入的庫不存在疼电,它還可以...
    winerss閱讀 290評論 0 2
  • 一嚼锄、MongoDB簡介 1.概述 ? MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫蔽豺。旨在為WE...
    鄭元吉閱讀 976評論 0 2
  • 在國慶節(jié)這個普天同慶的日子,廣州地鐵十一號線二分部三工區(qū)的一線工作者們并沒有選擇安逸的假期沧侥,而是仍堅守在工作崗...
    廣告位招租丶閱讀 213評論 0 0