您需要首先使用$unwind
操作時,它是在一個列表數據領域的應用,因爲它會爲每個上放鬆列表數據字段的每一個元素的新紀錄和應用。它基本上使數據平整,以便您可以將其作爲上一個管道中的單個文檔進行處理。
db.votecol.aggregate([
{ "$unwind": "$votes" },
{
"$group": {
"_id": "$votes.id",
"voteCount": { "$sum": 1 }
}
}
])
由於更新了自己的後續問題,您可以篩選要通過管道的文件來計算所「是」或「否」使用$match
操作之前投票並在$unwind
之後。對於獎勵積分,您可以使用$cond
運營商在$group
管道一步來評估基於嵌入式表決字段值計數的優勢:
db.votecol.aggregate([
{ "$match": { "votes.vote": { "$in": ["yes", "no"] } } },
{ "$unwind": "$votes" },
{ "$match": { "votes.vote": { "$in": ["yes", "no"] } } },
{
"$group": {
"_id": "$votes.id",
"voteCount": { "$sum": 1 },
"yesCount": {
"$sum": {
"$cond": [ { "$eq": [ "$votes.vote", "yes" ] }, 1, 0 ]
}
},
"noCount": {
"$sum": {
"$cond": [ { "$eq": [ "$votes.vote", "no" ] }, 1, 0 ]
}
}
}
}
])
是否有可能使這個只能算票是是「是」還是「否」,但沒有其他任何東西? – Hatshepsut
@哈特謝普蘇確實,請參閱上面的編輯。 – chridam
放鬆之前和之後的比賽有什麼區別? – Hatshepsut