我正在嘗試建立一個投票系統。我有一組選擇和一組選票
Choices 集合,顯示 'poll1' 中可用的選項
_id:'1',
pollId:'poll1',
choice:'red'
_id:'2',
pollId:'poll1',
choice:'blue'
_id:'3',
pollId:'poll1'
choice:'green'
選票收集
_id:'a'
choiceId:'3' // corresponds to the _id in the Choices collection
userId:'user1' // id of the user who voted
_id:'b'
choiceId:'3'
userId:'user2'
_id:'c'
choiceId:'1'
userId:'user3'
我希望能夠計算投票中每個選擇的票數。目前,我對 Votes 集合有以下基本查詢,它只回傳選擇的 id 和票數
[
{
'$match': {
'pollId': pollId
}
}, {
'$group': {
'_id': '$choiceId',
'votes': {
'$sum': 1
}
}
}
]
但是,我希望能夠使用對 Choices 集合的查找作為參考 - 對于投票中的每個可用選項,獲取該選項的選項 ID、選項名稱和投票數。
從閱讀檔案來看,它似乎是這樣的,但它只回傳該民意調查的所有選擇的陣列,以及總票數,而不是每個選擇的票數
[
{
'$match': {
'pollId': pollId
}
}, {
'$lookup': {
'from': 'choices',
'localField': 'pollId',
'foreignField': 'pollId',
'as': 'choiceData'
}
}, {
'$group': {
'_id': '$choiceData._id',
'votes': {
'$sum': 1
}
}
}
]
誰能解釋一下如何以下列結構獲取資料:
choiceId:'3', choice:'green', votes:2
choiceId:'1', choice:'red', votes:1
choiceId:'2', choice:'blue', votes:0
任何幫助將不勝感激。干杯,馬特
uj5u.com熱心網友回復:
您可以使用此聚合查詢:
- 首先
$match是您的投票名稱(就像您所做的那樣)。 - 然后用于
$lookup合并集合。但是這里有幾件事要做得更好:from是另一個集合,localField是集合中正在執行查找的欄位并且foreignField是另一個集合。所以你必須加入votescollection,其中collection中的欄位_id與collection中的欄位choices相同。choiceIdvotes - 最后
$project得到你想要的值。在這種情況下,設定choiceId為_id和votes作為查找回傳的結果數(即投票數)。
db.choices.aggregate([
{
"$match": {
"pollId": "poll1"
}
},
{
"$lookup": {
"from": "votes",
"localField": "_id",
"foreignField": "choiceId",
"as": "choiceData"
}
},
{
"$project": {
"_id": 0,
"choice": 1,
"choiceId": "$_id",
"votes": {
"$size": "$choiceData"
}
}
}
])
這里的例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418495.html
標籤:
上一篇:使用MongoDB.Driver將lambda運算式轉換為json物件
下一篇:MongoGroup按查詢
