文檔和集合
文檔
文檔是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:[]}})