名詞解釋
- $addToSet :為組里唯一的值創(chuàng)建一個(gè)數(shù)組,去除重復(fù)的值。
- $push : 返回組內(nèi)所有值的數(shù)組,不去除重復(fù)的值炮赦。
- tips:集合中的元素必須確保是唯一的,某個(gè)給定的值不能在集合中出現(xiàn)兩次样勃,通過 $addToSet 可以強(qiáng)制實(shí)行吠勘,而$push操作沒有符沒有這個(gè)限制,集合中的數(shù)據(jù)可以不是唯一的峡眶。因此剧防,相同的元素可以在$push創(chuàng)建的數(shù)組里面多次出現(xiàn)。個(gè)人感覺辫樱,這里的集合指的不一定是collections或者數(shù)據(jù)表峭拘,而是根據(jù)條件篩選出來的一個(gè)結(jié)果集,根據(jù)聚合管道的概念狮暑,“聚合里面的每一步輸出都將作為下一步的輸入鸡挠。每一步都在輸入文檔執(zhí)行單個(gè)操作并生成輸出文檔“崮校”
代碼實(shí)例
/* 數(shù)據(jù)表結(jié)構(gòu)如下 */
/* 1 */
{
"_id" : ObjectId("5c84f2819dc6d6412871b1f4"),
"citynum" : 3,
"albumname" : "我們的征途",
"city" : "19",
"channelid" : null,
"albumplaynum" : 19,
"cpid" : "05",
"time" : "20190309",
"payType" : "1",
"albumid" : "983357"
}
/* 2 */
{
"_id" : ObjectId("5c84f2819dc6d6412871b1f5"),
"citynum" : 1,
"albumname" : "我們的征途",
"city" : "22",
"channelid" : null,
"albumplaynum" : 19,
"cpid" : "05",
"time" : "20190309",
"payType" : "1",
"albumid" : "983357"
}
- 要求:根據(jù)時(shí)間拣展,按照albumid和cpid進(jìn)行分組,統(tǒng)計(jì)citynum的和缔逛,展現(xiàn)albumname字段以及citynum的和瞎惫。
- 使用聚合時(shí)溜腐,group中分組條件定義了哪些字段,結(jié)果集中將只能出現(xiàn)哪些字段瓜喇,如下所示。
/* 腳本如下 */
db.getCollection('userplay').aggregate([
{
$match:{'time':'20190219'}
},
{
$group:{
_id:{'albumid':'$albumid','cpid':'$cpid'},
sum:{'$sum':'$citynum'},
}
}
])
/* 執(zhí)行結(jié)果 ,更多數(shù)據(jù)此處省略*/
/* 1 */
{
"_id" : {
"albumid" : "2938",
"cpid" : "01"
},
"sum" : 48
}
/* 2 */
{
"_id" : {
"albumid" : "500003154",
"cpid" : "02"
},
"sum" : 4
}
- 如果想要取得更多的歉糜,除分組條件外的字段乘寒,就可以使用$addToSet和$push。如下所示匪补,
/* $push */
db.getCollection('userplay').aggregate([
{
$match:{'time':'20190219'}
},
{
$group:{
_id:{'albumid':'$albumid','cpid':'$cpid'},
sum:{'$sum':'$citynum'},
albumname:{$push:'$albumname'},
}
}
])
/* 結(jié)果如下 */
/* 1 */
{
"_id" : {
"albumid" : "2938",
"cpid" : "01"
},
"sum" : 48,
"albumname" : [
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞",
"小胖妞"
]
}
/* 2 */
{
"_id" : {
"albumid" : "500003154",
"cpid" : "02"
},
"sum" : 4,
"albumname" : [
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 ",
"我是大熊貓 "
]
}
顯然不是我想要的結(jié)果伞辛,因?yàn)閍lbumname字段的值重復(fù)了,而我只要一個(gè)值夯缺。
根據(jù)文檔中寫到的“集合中的元素必須確保是唯一的蚤氏,某個(gè)給定的值不能在集合中出現(xiàn)兩次,通過 $addToSet 可以強(qiáng)制實(shí)行踊兜,而$push操作沒有符沒有這個(gè)限制竿滨,集合中的數(shù)據(jù)可以不是唯一的。因此捏境,相同的元素可以在$push創(chuàng)建的數(shù)組里面多次出現(xiàn)于游。”
將$push修改為$addToSet再次執(zhí)行垫言。
/* 執(zhí)行腳本 */
db.getCollection('userplay').aggregate([
{
$match:{'time':'20190219'}
},
{
$group:{
_id:{'albumid':'$albumid','cpid':'$cpid'},
sum:{'$sum':'$citynum'},
albumname:{$addToSet:'$albumname'},
}
}
])
/* 結(jié)果如下 */
/* 1 */
{
"_id" : {
"albumid" : "2938",
"cpid" : "01"
},
"sum" : 48,
"albumname" : [
"小胖妞"
]
}
/* 2 */
{
"_id" : {
"albumid" : "500003154",
"cpid" : "02"
},
"sum" : 4,
"albumname" : [
"我是大熊貓 "
]
}
/* 3 */
{
"_id" : {
"albumid" : "795985",
"cpid" : "02"
},
"sum" : 48,
"albumname" : [
"黑夜傳說Ⅳ:覺醒.3D(片段)"
]
}
OK贰剥,達(dá)到想要的效果,之前項(xiàng)目中遇到了類似的問題筷频,查看文檔時(shí)看到了解決方法蚌成,記錄一下。
好記性不如一篇好筆記凛捏!