MongoDB Aggregation聚合操作

MongoDB Aggregation

最近在做產(chǎn)品的后臺管理時(shí),查詢的數(shù)據(jù)量比較大時(shí),MongoDB會報(bào)錯(cuò),由于在查詢時(shí)使用了排序功能铁追,

Sort operation used more than the maximum 33554432 bytes of RAM.
Add an index, or specify a smaller limit..

根據(jù)官方文檔的描述,Sort是在內(nèi)存中的操作茫船,使用的內(nèi)存不能超過32MB琅束,如果超過了32MB癣蟋,就會報(bào)
錯(cuò)誤。建議增加 Index索引狰闪,但是增加索引會增加存儲量疯搅,也會影響寫入的速度

可以使用 Aggregation聚合,來操作大量的數(shù)據(jù)的查詢和排序

  • Aggregation Pipeline操作的限制

    MongoDB2.6之后,Aggregation Pipeline操作的最大的內(nèi)存限制是100MB润绎,如果超過100MB也會報(bào)錯(cuò)谭跨,
    在使用 Aggregation時(shí),如果要處理大量的數(shù)據(jù)時(shí)礁蔗,請使用 allowDiskUse 參數(shù),這個(gè)參數(shù)可以將
    要處理的數(shù)據(jù)先寫入到臨時(shí)文件中

Aggregation 操作

db.collection.aggregate( [ { <stage> }, ... ] )
$match
$sort
$limit
....

具體的stage相關(guān)的語句雁社,請參考官方支持的表達(dá)式 aggregate pipeline operation

Aggregation C# Driver

// connectionString="mongodb://127.0.0.1:27017"

var client = new MongoClient(connectionString);
IMongoDatabase _db = client.GetDatabase(dbName);
var collection = GetCollection<T>(collectionName)


IList<IPipelineStageDefinition> stages = new List<IPipelineStageDefinition>();

//查詢
string f = "{ $or: [ { _id: { $eq:" + "\"" + query + "\"} }, { sn: { $eq: " + "\"" + query + "\" } } ] }";
string idMatch = "{ $match: " + f + "}";
PipelineStageDefinition<T, T> queryPipline = new JsonPipelineStageDefinition<T, T>(idMatch);

stages.Add(queryPipline);

//排序
string sortPipeline = "{$sort:{time:-1}}";
PipelineStageDefinition<T, T> sortPipline = new JsonPipelineStageDefinition<T, T>(sortPipeline);

stages.Add(sortPipline);

//分頁
string skipPiple = "{$skip:" + page * 10 + "}";
string limitPiple = "{$limit:" + 10 + "}";
PipelineStageDefinition<T, T> skipPipline = new JsonPipelineStageDefinition<T, T>(skipPiple);
PipelineStageDefinition<T, T> limitPipline = new JsonPipelineStageDefinition<T, T>(limitPiple);

stages.Add(skipPipline);
stages.Add(limitPipline);

PipelineDefinition<T, T> pipe = new PipelineStagePipelineDefinition<T, T>(stages);


AggregateOptions options = new AggregateOptions();
options.AllowDiskUse = true;

collection.Aggregate<T>(pipeline, options).ToList();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浴井,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霉撵,更是在濱河造成了極大的恐慌磺浙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徒坡,死亡現(xiàn)場離奇詭異撕氧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喇完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門伦泥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锦溪,你說我怎么就攤上這事不脯。” “怎么了刻诊?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵防楷,是天一觀的道長。 經(jīng)常有香客問我坏逢,道長域帐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任是整,我火速辦了婚禮肖揣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浮入。我一直安慰自己龙优,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布事秀。 她就那樣靜靜地躺著彤断,像睡著了一般野舶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宰衙,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天平道,我揣著相機(jī)與錄音,去河邊找鬼供炼。 笑死一屋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袋哼。 我是一名探鬼主播冀墨,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涛贯!你這毒婦竟也來了诽嘉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弟翘,失蹤者是張志新(化名)和其女友劉穎虫腋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衅胀,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岔乔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滚躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘿歌,死狀恐怖掸掏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宙帝,我是刑警寧澤丧凤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站步脓,受9級特大地震影響愿待,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靴患,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一仍侥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸳君,春花似錦农渊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽传于。三九已至,卻和暖如春醉顽,著一層夾襖步出監(jiān)牢的瞬間沼溜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工游添, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盛末,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓否淤,卻偏偏與公主長得像悄但,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子石抡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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