純前端一枚,之前沒有接觸后臺數(shù)據(jù)庫,現(xiàn)在學(xué)習(xí)mongodb數(shù)據(jù)庫,遇到這樣的一個(gè)情景,建立一個(gè)博客的數(shù)據(jù)庫,有這樣一個(gè)包含所有文章信息的集合,數(shù)據(jù)偽造如下:
{ "id" : 1, "name" : "one", "tags" : [ "a", "c", "e" ] }
{ "id" : 2, "name" : "two", "tags" : [ "e" ] }
{ "id" : 3, "name" : "three", "tags" : [ "d", "e" ] }
{ "id" : 4, "name" : "four", "tags" : [ "g", "c", "e", "h" ] }
{ "id" : 5, "name" : "five", "tags" : [ "a", "c", "d" ] }
tags 表示這篇文章所屬的標(biāo)簽類型,現(xiàn)在想要查詢出有多少個(gè)不同的標(biāo)簽類型,每個(gè)標(biāo)簽下有多少條數(shù)據(jù),這個(gè)該怎么實(shí)現(xiàn)?目前想到的是用 aggregate 中的 $unwind 將 tags 進(jìn)行拆分,然后再用 $group 進(jìn)行分組統(tǒng)計(jì),但是具體代碼該怎么寫,或者是有其他更有效的方式,請指教?。?!
數(shù)據(jù)提取出來后,這就是純統(tǒng)計(jì)算法問題了,跟是否前后端無關(guān),當(dāng)然實(shí)現(xiàn)起來也是比較簡單
const list = [
{"id": 1, "name": "one", "tags": ["a", "c", "e"]},
{"id": 2, "name": "two", "tags": ["e"]},
{"id": 3, "name": "three", "tags": ["d", "e"]},
{"id": 4, "name": "four", "tags": ["g", "c", "e", "h"]},
{"id": 5, "name": "five", "tags": ["a", "c", "d"]}
];
const result = {
length: 0 //不同的標(biāo)簽類型個(gè)數(shù)
};
list.forEach(item => {
item.tags.forEach(tag => {
if (!result[tag]) {
result[tag] = {
name: tag, //標(biāo)簽名
list: [] //包含含有此標(biāo)簽的id 數(shù)組length就是此標(biāo)簽下的條目數(shù)
};
result.length += 1;
}
result[tag].list.push(item.id);
})
});
console.log(result)
這是個(gè)很經(jīng)典的統(tǒng)計(jì)問題,其實(shí)已經(jīng)不是MongoDB特有的范疇了,對于其他數(shù)據(jù)庫來講也是通用的。
你想的辦法本身是沒有問題的,肯定可以通過aggregation的$unwind
+$group
得到你想要的結(jié)果。問題在于隨著時(shí)間推移,參與統(tǒng)計(jì)的博客數(shù)量將會越來越多,意味著你的統(tǒng)計(jì)語句將越來越慢。問題的關(guān)鍵在于如何限制住每次參與統(tǒng)計(jì)的記錄數(shù)。
從另一個(gè)角度講,博客一般寫完就很少有改動了,今天統(tǒng)計(jì)昨天的所有博客各屬于哪些標(biāo)簽,跟明天再來統(tǒng)計(jì)昨天的得到的結(jié)果應(yīng)該是一樣的(假設(shè)沒有修改的前提下)。所以每次都進(jìn)行統(tǒng)計(jì)其實(shí)是浪費(fèi)。
基于以上這些考慮,你其實(shí)可以每隔一段時(shí)間(比如每天)統(tǒng)計(jì)一次每個(gè)標(biāo)簽都有多少次出現(xiàn),把它們存起來,在需要時(shí)再把這些已經(jīng)聚合過一次的數(shù)據(jù)再次聚合。這種方式稱為預(yù)聚合。
大概的方向是這樣,細(xì)節(jié)的問題你可以先自己思考一下。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。