柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫(kù) MongoDB聚合操作
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫(kù) MongoDB聚合操作
文章目錄
聚合操作單一作用聚合聚合管道什么是 MongoDB 聚合框架管道(Pipeline)和階段(Stage)常用的管道聚合階段聚合表達(dá)式數(shù)據(jù)準(zhǔn)備$project$match$count$group
accumulator操作符$unwind$limit$skip$sort$lookup案例聚合操作案例1聚合操作案例2
MapReduce
聚合操作
聚合操作處理數(shù)據(jù)記錄并返回計(jì)算結(jié)果。聚合操作組值來(lái)自多個(gè)文檔,可以對(duì)分組數(shù)據(jù)執(zhí)行各種操作以返回單個(gè)結(jié)果。聚合操作包含三類:?jiǎn)我蛔饔镁酆稀⒕酆瞎艿?、MapReduce。
單一作用聚合:提供了對(duì)常見(jiàn)聚合過(guò)程的簡(jiǎn)單訪問(wèn),操作都從單個(gè)集合聚合文檔。聚合管道是一個(gè)數(shù)據(jù)聚合的框架,模型基于數(shù)據(jù)處理流水線的概念。文檔進(jìn)入多級(jí)管道,將 文檔轉(zhuǎn)換為聚合結(jié)果。MapReduce操作具有兩個(gè)階段:處理每個(gè)文檔并向每個(gè)輸入文檔發(fā)射一個(gè)或多個(gè)對(duì)象的map階段,以及reduce組合map操作的輸出階段。
單一作用聚合
MongoDB提供 db.collection.estimatedDocumentCount(), db.collection.count(), db.collection.distinct() 這類單一作用的聚合函數(shù)。 所有這些操作都聚合來(lái)自單個(gè)集合的文檔。雖然這些操作提供了對(duì)公共聚合過(guò)程的簡(jiǎn)單訪問(wèn),但它們?nèi)狈酆瞎艿篮蚼ap-Reduce的靈活性和功能。
db.collection.estimatedDocumentCount()返回集合或視圖中所有文檔的計(jì)數(shù)db.collection.count()返回與find()集合或視圖的查詢匹配的文檔計(jì)數(shù) 。等同于 db.collection.find(query).count()構(gòu)造db.collection.distinct()在單個(gè)集合或視圖中查找指定字段的不同值,并在數(shù)組中返回結(jié)果。
#檢索books集合中所有文檔的計(jì)數(shù)
db.books.estimatedDocumentCount()
#計(jì)算與查詢匹配的所有文檔
db.books.count({favCount:{$gt:50}})
#返回不同type的數(shù)組
db.books.distinct("type")
#返回收藏?cái)?shù)大于90的文檔不同type的數(shù)組
db.books.distinct("type",{favCount:{$gt:90}})
注意:在分片群集上,如果存在孤立文檔或正在進(jìn)行塊遷移,則db.collection.count()沒(méi)有查詢謂詞可能導(dǎo)致計(jì)數(shù)不準(zhǔn)確。要避免這些情況,請(qǐng)?jiān)诜制杭鲜褂?db.collection.aggregate()方法。
聚合管道
什么是 MongoDB 聚合框架
MongoDB 聚合框架(Aggregation Framework)是一個(gè)計(jì)算框架,它可以:
作用在一個(gè)或幾個(gè)集合上;對(duì)集合中的數(shù)據(jù)進(jìn)行的一系列運(yùn)算;將這些數(shù)據(jù)轉(zhuǎn)化為期望的形式;
從效果而言,聚合框架相當(dāng)于 SQL 查詢中的GROUP BY、 LEFT OUTER JOIN 、 AS等。
管道(Pipeline)和階段(Stage)
整個(gè)聚合運(yùn)算過(guò)程稱為管道(Pipeline),它是由多個(gè)階段(Stage)組成的, 每個(gè)管道:
接受一系列文檔(原始數(shù)據(jù));每個(gè)階段對(duì)這些文檔進(jìn)行一系列運(yùn)算;結(jié)果文檔輸出給下一個(gè)階段;
聚合管道操作語(yǔ)法
pipeline = [$stage1, $stage2, ...$stageN];
db.collection.aggregate(pipeline, {options})
pipelines 一組數(shù)據(jù)聚合階段。除
o
u
t
、
out、
out、Merge和$geonear階段之外,每個(gè)階段都可以在管道中出現(xiàn)多次。options 可選,聚合操作的其他參數(shù)。包含:查詢計(jì)劃、是否使用臨時(shí)文件、 游標(biāo)、最大操作時(shí)間、讀寫策略、強(qiáng)制索引等等
常用的管道聚合階段
聚合管道包含非常豐富的聚合階段,下面是最常用的聚合階段
階段描述SQL等價(jià)運(yùn)算符$match篩選條件WHERE$project投影AS$lookup左外連接LEFT OUTER JOIN$sort排序ORDER BY$group分組GROUP BY
s
k
i
p
/
skip/
skip/limit分頁(yè)$unwind展開(kāi)數(shù)組$graphLookup圖搜索
f
a
c
e
t
/
facet/
facet/bucket分面搜索
文檔:Aggregation Pipeline Stages — MongoDB Manual
聚合表達(dá)式
獲取字段信息
$
$
常量表達(dá)式
$literal :
系統(tǒng)變量表達(dá)式
$$
$$CURRENT 指示管道中當(dāng)前操作的文檔
數(shù)據(jù)準(zhǔn)備
準(zhǔn)備數(shù)據(jù)集,執(zhí)行腳本
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<50;i++){
var typeIdx = Math.floor(Math.random()*types.length);
var tagIdx = Math.floor(Math.random()*tags.length);
var tagIdx2 = Math.floor(Math.random()*tags.length);
var favCount = Math.floor(Math.random()*100);
var username = "xx00"+Math.floor(Math.random()*10);
var age = 20 + Math.floor(Math.random()*15);
var book = {
title: "book-"+i,
type: types[typeIdx],
tag: [tags[tagIdx],tags[tagIdx2]],
favCount: favCount,
author: {name:username,age:age}
};
books.push(book)
}
db.books.insertMany(books);
$project
投影操作, 將原始字段投影成指定名稱, 如將集合中的 title 投影成 name
db.books.aggregate([{$project:{name:"$title"}}])
$project 可以靈活控制輸出文檔的格式,也可以剔除不需要的字段
db.books.aggregate([{$project:{name:"$title",_id:0,type:1,author:1}}])
從嵌套文檔中排除字段
db.books.aggregate([
{$project:{name:"$title",_id:0,type:1,"author.name":1}}
])
或者
db.books.aggregate([
{$project:{name:"$title",_id:0,type:1,author:{name:1}}}
])
$match
m
a
t
c
h
用于對(duì)文檔進(jìn)行篩選,之后可以在得到的文檔子集上做聚合,
match用于對(duì)文檔進(jìn)行篩選,之后可以在得到的文檔子集上做聚合,
match用于對(duì)文檔進(jìn)行篩選,之后可以在得到的文檔子集上做聚合,match可以使用除了地理空間之外的所有常規(guī)查詢操作符,在實(shí)際應(yīng)用中盡可能將
m
a
t
c
h
放在管道的前面位置。這樣有兩個(gè)好處:一是可以快速將不需要的文檔過(guò)濾掉,以減少管道的工作量;二是如果再投射和分組之前執(zhí)行
match放在管道的前面位置。這樣有兩個(gè)好處:一是可以快速將不需要的文檔過(guò)濾掉,以減少管道的工作量;二是如果再投射和分組之前執(zhí)行
match放在管道的前面位置。這樣有兩個(gè)好處:一是可以快速將不需要的文檔過(guò)濾掉,以減少管道的工作量;二是如果再投射和分組之前執(zhí)行match,查詢可以使用索引。
db.books.aggregate([{$match:{type:"technology"}}])
篩選管道操作和其他管道操作配合時(shí)候時(shí),盡量放到開(kāi)始階段,這樣可以減少后續(xù)管道操作符要操作的文檔數(shù),提升效率
db.books.aggregate([
{$match:{type:"technology"}},
{$project:{name:"$title",_id:0,type:1,author:{name:1}}}
])
$count
計(jì)數(shù)并返回與查詢匹配的結(jié)果數(shù)
db.books.aggregate([
{$match:{type:"technology"}},
{$count: "type_count"}
])
$match階段篩選出type匹配technology的文檔,并傳到下一階段; $count階段返回聚合管道中剩余文檔的計(jì)數(shù),并將該值分配給type_count
$group
按指定的表達(dá)式對(duì)文檔進(jìn)行分組,并將每個(gè)不同分組的文檔輸出到下一個(gè)階段。輸出文檔包含一個(gè)_id字段,該字段按鍵包含不同的組。輸出文檔還可以包含計(jì)算字段,該字段保存由$group的_id字段分組的一些accumulator表達(dá)式的值。 $group不會(huì)輸出具體的文檔而只是統(tǒng)計(jì)信息。
{ $group: { _id:
_id字段是必填的;但是,可以指定_id值為null來(lái)為整個(gè)輸入文檔計(jì)算累計(jì)值。剩余的計(jì)算字段是可選的,并使用運(yùn)算符進(jìn)行計(jì)算。_id和表達(dá)式可以接受任何有效的表達(dá)式。
accumulator操作符
名稱描述類比sql$avg計(jì)算均值avg$first返回每組第一個(gè)文檔,如果有排序,按照排序,如果沒(méi)有按照默認(rèn)的存儲(chǔ)的順序的第一個(gè)文檔。limit 0,1$last返回每組最后一個(gè)文檔,如果有排序,按照排序,如果沒(méi)有按照默認(rèn)的存儲(chǔ)的順序的最后個(gè)文檔。-$max根據(jù)分組,獲取集合中所有文檔對(duì)應(yīng)值得最大值。max$min根據(jù)分組,獲取集合中所有文檔對(duì)應(yīng)值得最小值。min$push將指定的表達(dá)式的值添加到一個(gè)數(shù)組中。-$addToSet將表達(dá)式的值添加到一個(gè)集合中(無(wú)重復(fù)值,無(wú)序)。-$sum計(jì)算總和sum$stdDevPop返回輸入值的總體標(biāo)準(zhǔn)偏差(population standard deviation)-$stdDevSamp返回輸入值的樣本標(biāo)準(zhǔn)偏差(the sample standard deviation)-
g
r
o
u
p
階段的內(nèi)存限制為
100
M
。默認(rèn)情況下,如果
s
t
a
g
e
超過(guò)此限制,
group階段的內(nèi)存限制為100M。默認(rèn)情況下,如果stage超過(guò)此限制,
group階段的內(nèi)存限制為100M。默認(rèn)情況下,如果stage超過(guò)此限制,group將產(chǎn)生錯(cuò)誤。但是,要允許處理大型數(shù)據(jù)集,請(qǐng)將allowDiskUse選項(xiàng)設(shè)置為true以啟用$group操作以寫入臨時(shí)文件。book的數(shù)量,收藏總數(shù)和平均值
db.books.aggregate([
{$group:{_id:null,count:{$sum:1},pop:{$sum:"$favCount"},avg:{$avg:"$favCount"}}}
])
統(tǒng)計(jì)每個(gè)作者的book收藏總數(shù)
db.books.aggregate([
{$group:{_id:"$author.name",pop:{$sum:"$favCount"}}}
])
統(tǒng)計(jì)每個(gè)作者的每本book的收藏?cái)?shù)
db.books.aggregate([
{$group:{_id:{name:"$author.name",title:"$title"},pop:{$sum:"$favCount"}}}
])
每個(gè)作者的book的type合集
db.books.aggregate([
{$group:{_id:"$author.name",types:{$addToSet:"$type"}}}
])
$unwind
可以將數(shù)組拆分為單獨(dú)的文檔v3.2+支持如下語(yǔ)法:
{
$unwind:
{
#要指定字段路徑,在字段名稱前加上$符并用引號(hào)括起來(lái)。
path:
#可選,一個(gè)新字段的名稱用于存放元素的數(shù)組索引。該名稱不能以$開(kāi)頭。
includeArrayIndex:
#可選,default :false,若為true,如果路徑為空,缺少或?yàn)榭諗?shù)組,則$unwind輸出文檔
preserveNullAndEmptyArrays:
} }
姓名為xx006的作者的book的tag數(shù)組拆分為多個(gè)文檔
db.books.aggregate([
{$match:{"author.name":"xx006"}},
{$unwind:"$tag"}
])
db.books.aggregate([
{$match:{"author.name":"xx006"}}
])
每個(gè)作者的book的tag合集
db.books.aggregate([
{$unwind:"$tag"},
{$group:{_id:"$author.name",types:{$addToSet:"$tag"}}}
])
案例示例數(shù)據(jù)
db.books.insert([
{
"title" : "book-51",
"type" : "technology",
"favCount" : 11,
"tag":[],
"author" : {
"name" : "fox",
"age" : 28
}
},{
"title" : "book-52",
"type" : "technology",
"favCount" : 15,
"author" : {
"name" : "fox",
"age" : 28
}
},{
"title" : "book-53",
"type" : "technology",
"tag" : [
"nosql",
"document"
],
"favCount" : 20,
"author" : {
"name" : "fox",
"age" : 28
}
}])
測(cè)試
# 使用includeArrayIndex選項(xiàng)來(lái)輸出數(shù)組元素的數(shù)組索引
db.books.aggregate([
{$match:{"author.name":"fox"}},
{$unwind:{path:"$tag", includeArrayIndex: "arrayIndex"}}
])
# 使用preserveNullAndEmptyArrays選項(xiàng)在輸出中包含缺少size字段,null或空數(shù)組的文檔
db.books.aggregate([
{$match:{"author.name":"fox"}},
{$unwind:{path:"$tag", preserveNullAndEmptyArrays: true}}
])
$limit
限制傳遞到管道中下一階段的文檔數(shù)
db.books.aggregate([
{$limit : 5 }
])
此操作僅返回管道傳遞給它的前5個(gè)文檔。
l
i
m
i
t
對(duì)其傳遞的文檔內(nèi)容沒(méi)有影響。
<
b
r
/
>
注意:當(dāng)
limit對(duì)其傳遞的文檔內(nèi)容沒(méi)有影響。
注意:當(dāng)
limit對(duì)其傳遞的文檔內(nèi)容沒(méi)有影響。
注意:當(dāng)sort在管道中的
l
i
m
i
t
之前立即出現(xiàn)時(shí),
limit之前立即出現(xiàn)時(shí),
limit之前立即出現(xiàn)時(shí),sort操作只會(huì)在過(guò)程中維持前n個(gè)結(jié)果,其中n是指定的限制,而MongoDB只需要將n個(gè)項(xiàng)存儲(chǔ)在內(nèi)存中。
$skip
跳過(guò)進(jìn)入stage的指定數(shù)量的文檔,并將其余文檔傳遞到管道中的下一個(gè)階段
db.books.aggregate([
{$skip : 5 }
])
此操作將跳過(guò)管道傳遞給它的前5個(gè)文檔。 $skip對(duì)沿著管道傳遞的文檔的內(nèi)容沒(méi)有影響。
$sort
對(duì)所有輸入文檔進(jìn)行排序,并按排序順序?qū)⑺鼈兎祷氐焦艿?。語(yǔ)法:
{ $sort: {
要對(duì)字段進(jìn)行排序,請(qǐng)將排序順序設(shè)置為1或-1,以分別指定升序或降序排序,如下例所示:
db.books.aggregate([
{$sort : {favCount:-1,title:1}}
])
$lookup
Mongodb 3.2版本新增,主要用來(lái)實(shí)現(xiàn)多表關(guān)聯(lián)查詢, 相當(dāng)關(guān)系型數(shù)據(jù)庫(kù)中多表關(guān)聯(lián)查詢。每個(gè)輸入待處理的文檔,經(jīng)過(guò)$lookup 階段的處理,輸出的新文檔中會(huì)包含一個(gè)新生成的數(shù)組(可根據(jù)需要命名新key )。數(shù)組列存放的數(shù)據(jù)是來(lái)自被Join集合的適配文檔,如果沒(méi)有,集合為空(即 為[ ])語(yǔ)法:
db.collection.aggregate([{
$lookup: {
from: "
localField: "
foreignField: "
as: "
}
})
from同一個(gè)數(shù)據(jù)庫(kù)下等待被Join的集合。localField源集合中的match值,如果輸入的集合中,某文檔沒(méi)有 localField這個(gè)Key(Field),在處理的過(guò)程中,會(huì)默認(rèn)為此文檔含有 localField:null的鍵值對(duì)。foreignField待Join的集合的match值,如果待Join的集合中,文檔沒(méi)有foreignField值,在處理的過(guò)程中,會(huì)默認(rèn)為此文檔含有 foreignField:null的鍵值對(duì)。as為輸出文檔的新增值命名。如果輸入的集合中已存在該值,則會(huì)覆蓋掉
注意:null = null 此為真其語(yǔ)法功能類似于下面的偽SQL語(yǔ)句:
SELECT *,
FROM collection
WHERE
FROM
WHERE
案例
數(shù)據(jù)準(zhǔn)備
db.customer.insert({customerCode:1,name:"customer1",phone:"13112345678",address:"test1"})
db.customer.insert({customerCode:2,name:"customer2",phone:"13112345679",address:"test2"})
db.order.insert({orderId:1,orderCode:"order001",customerCode:1,price:200})
db.order.insert({orderId:2,orderCode:"order002",customerCode:2,price:400})
db.orderItem.insert({itemId:1,productName:"apples",qutity:2,orderId:1})
db.orderItem.insert({itemId:2,productName:"oranges",qutity:2,orderId:1})
db.orderItem.insert({itemId:3,productName:"mangoes",qutity:2,orderId:1})
db.orderItem.insert({itemId:4,productName:"apples",qutity:2,orderId:2})
db.orderItem.insert({itemId:5,productName:"oranges",qutity:2,orderId:2})
db.orderItem.insert({itemId:6,productName:"mangoes",qutity:2,orderId:2})
關(guān)聯(lián)查詢
db.customer.aggregate([
{$lookup: {
from: "order",
localField: "customerCode",
foreignField: "customerCode",
as: "customerOrder"
}
}
])
db.order.aggregate([
{$lookup: {
from: "customer",
localField: "customerCode",
foreignField: "customerCode",
as: "curstomer"
}
},
{$lookup: {
from: "orderItem",
localField: "orderId",
foreignField: "orderId",
as: "orderItem"
}
}
])
聚合操作案例1
統(tǒng)計(jì)每個(gè)分類的book文檔數(shù)量
db.books.aggregate([
{$group:{_id:"$type",total:{$sum:1}}},
{$sort:{total:-1}}
])
標(biāo)簽的熱度排行,標(biāo)簽的熱度則按其關(guān)聯(lián)book文檔的收藏?cái)?shù)(favCount)來(lái)計(jì)算
db.books.aggregate([
{$match:{favCount:{$gt:0}}},
{$unwind:"$tag"},
{$group:{_id:"$tag",total:{$sum:"$favCount"}}},
{$sort:{total:-1}}
])
$match階段:用于過(guò)濾favCount=0的文檔。$unwind階段:用于將標(biāo)簽數(shù)組進(jìn)行展開(kāi),這樣一個(gè)包含3個(gè)標(biāo)簽的文檔會(huì)被拆解為3個(gè)條目。
g
r
o
u
p
階段:對(duì)拆解后的文檔進(jìn)行分組計(jì)算,
group階段:對(duì)拆解后的文檔進(jìn)行分組計(jì)算,
group階段:對(duì)拆解后的文檔進(jìn)行分組計(jì)算,sum:"$favCount"表示按favCount字段進(jìn)行累加。$sort階段:接收分組計(jì)算的輸出,按total得分進(jìn)行排序。
統(tǒng)計(jì)book文檔收藏?cái)?shù)[0,10),[10,60),[60,80),[80,100),[100,+∞)
db.books.aggregate([{
$bucket:{
groupBy:"$favCount",
boundaries:[0,10,60,80,100],
default:"other",
output:{"count":{$sum:1}}
}
}])
聚合操作案例2
導(dǎo)入郵政編碼數(shù)據(jù)集:https://media.mongodb.org/zips.json使用mongoimport工具導(dǎo)入數(shù)據(jù)
mongoimport -h 192.168.65.174 -d test -u fox -p fox --authenticationDatabase=admin -c zips --file D:\ProgramData\mongodb\import\zips.json
h,–host :代表遠(yuǎn)程連接的數(shù)據(jù)庫(kù)地址,默認(rèn)連接本地Mongo數(shù)據(jù)庫(kù); –port:代表遠(yuǎn)程連接的數(shù)據(jù)庫(kù)的端口,默認(rèn)連接的遠(yuǎn)程端口27017; -u,–username:代表連接遠(yuǎn)程數(shù)據(jù)庫(kù)的賬號(hào),如果設(shè)置數(shù)據(jù)庫(kù)的認(rèn)證,需要指定用戶賬號(hào); -p,–password:代表連接數(shù)據(jù)庫(kù)的賬號(hào)對(duì)應(yīng)的密碼; -d,–db:代表連接的數(shù)據(jù)庫(kù); -c,–collection:代表連接數(shù)據(jù)庫(kù)中的集合; -f, --fields:代表導(dǎo)入集合中的字段; –type:代表導(dǎo)入的文件類型,包括csv和json,tsv文件,默認(rèn)json格式; –file:導(dǎo)入的文件名稱 –headerline:導(dǎo)入csv文件時(shí),指明第一行是列名,不需要導(dǎo)入;
返回人口超過(guò)1000萬(wàn)的州
db.zips.aggregate( [
{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match: { totalPop: { $gte: 10*1000*1000 } } }
] )
這個(gè)聚合操作的等價(jià)SQL是: SELECT state, SUM(pop) AS totalPop FROM zips GROUP BY state HAVING totalPop >= (1010001000) 返回各州平均城市人口
SELECT state, SUM(pop) AS totalPop
FROM zips
GROUP BY state
HAVING totalPop >= (10*1000*1000)
按州返回最大和最小的城市
db.zips.aggregate( [
{ $group:
{
_id: { state: "$state", city: "$city" },
pop: { $sum: "$pop" }
}
},
{ $sort: { pop: 1 } },
{ $group:
{
_id : "$_id.state",
biggestCity: { $last: "$_id.city" },
biggestPop: { $last: "$pop" },
smallestCity: { $first: "$_id.city" },
smallestPop: { $first: "$pop" }
}
},
{ $project:
{ _id: 0,
state: "$_id",
biggestCity: { name: "$biggestCity", pop: "$biggestPop" },
smallestCity: { name: "$smallestCity", pop: "$smallestPop" }
}
}
] )
MapReduce
MapReduce操作將大量的數(shù)據(jù)處理工作拆分成多個(gè)線程并行處理,然后將結(jié)果合并在一起。MongoDB提供的Map-Reduce非常靈活,對(duì)于大規(guī)模數(shù)據(jù)分析也相當(dāng)實(shí)用。MapReduce具有兩個(gè)階段:
將具有相同Key的文檔數(shù)據(jù)整合在一起的map階段組合map操作的結(jié)果進(jìn)行統(tǒng)計(jì)輸出的reduce階段
MapReduce的基本語(yǔ)法
db.collection.mapReduce(
function() {emit(key,value);}, //map 函數(shù)
function(key,values) {return reduceFunction}, //reduce 函數(shù)
{
out:
query:
sort:
limit:
finalize:
scope:
jsMode:
verbose:
bypassDocumentValidation:
}
)
map,將數(shù)據(jù)拆分成鍵值對(duì),交給reduce函數(shù)reduce,根據(jù)鍵將值做統(tǒng)計(jì)運(yùn)算out,可選,將結(jié)果匯入指定表quey,可選篩選數(shù)據(jù)的條件,篩選的數(shù)據(jù)送入mapsort,排序完后,送入maplimit,限制送入map的文檔數(shù)finalize,可選,修改reduce的結(jié)果后進(jìn)行輸出scope,可選,指定map、reduce、finalize的全局變量jsMode,可選,默認(rèn)false。在mapreduce過(guò)程中是否將數(shù) 據(jù)轉(zhuǎn)換成bson格式。verbose,可選,是否在結(jié)果中顯示時(shí)間,默認(rèn)falsebypassDocmentValidation,可選,是否略過(guò)數(shù)據(jù)校驗(yàn)
統(tǒng)計(jì)type為travel的不同作者的book文檔收藏?cái)?shù)
db.books.mapReduce(
function(){emit(this.type,this.favCount)},
function(key,values){return Array.sum(values)},
{
query:{type:"travel"},
out: "books_favCount"
}
)
從MongoDB 5.0開(kāi)始,map-reduce操作已被棄用。聚合管道比映射-reduce操作提供更好的性能和可用性。Map-reduce操作可以使用聚合管道操作符重寫,例如
g
r
o
u
p
、
group、
group、merge等。dn
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫(kù) MongoDB聚合操作
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。