我的集合 userresults 包含 userref 和 sessionref 唯一的檔案。會話在結果陣列中具有選擇的游戲結果。我已經過濾了結果以回傳那些包含游戲“俱樂部”結果的用戶結果檔案。
[{
"userref": "AAA",
"sessionref" : "S1",
"results": [{
"gameref": "Spades",
"dateplayed": ISODate(2022-01-01T10:00:00),
"score": 1000
}, {
"gameref": "Hearts",
"dateplayed": ISODate(2022-01-02T10:00:00),
"score": 500
}, {
"gameref": "Clubs",
"dateplayed": ISODate(2022-01-05T10:00:00),
"score": 200
}]
}, {
"userref": "AAA",
"sessionref" : "S2",
"results": [{
"gameref": "Spades",
"dateplayed": ISODate(2022-02-02T10:00:00),
"score": 1000
}, {
"gameref": "Clubs",
"dateplayed": ISODate(2022-05-02T10:00:00),
"score": 200
}]
}, {
"userref": "BBB",
"sessionref" : "S1",
"results": [{
"gameref": "Clubs",
"dateplayed": ISODate(2022-01-05T10:00:00),
"score": 200
}]
}]
我需要在我的聚合中為每個用戶選擇包含最近玩過的俱樂部游戲的用戶結果檔案,即在這種情況下,它將回傳 AAA/S2 檔案和 BBB/S1 檔案。
我猜我需要 userref 上的一個組作為起點,但是如何根據最近的俱樂部日期選擇檔案的其余部分?
謝謝!
uj5u.com熱心網友回復:
如果我理解正確,你可以試試這個聚合管道:
- 首先,我習慣于
$filter避免$unwind進入整個集合。有了這個,您只能將物件放入 is 的陣列results中。gamerefClubs - 下一階段現在是,
$unwind但在這種情況下,只有剩余的檔案,而不是整個集合。請注意,此階段不會傳遞到沒有任何檔案的下一階段"gameref": "Clubs"。 - 現在
$sort剩下的結果是dateplayed在第一個位置獲得最近的日期。 - 最后
$group用于$first獲取您想要的資料。由于檔案按 排序dateplayed,您可以獲得所需的結果。
db.collection.aggregate([
{
"$set": {
"results": {
"$filter": {
"input": "$results",
"cond": {
"$eq": [
"$$this.gameref",
"Clubs"
]
}
}
}
}
},
{
"$unwind": "$results"
},
{
"$sort": {
"results.dateplayed": -1
}
},
{
"$group": {
"_id": "$userref",
"results": {
"$first": "$results"
},
"sessionref": {
"$first": "$sessionref"
}
}
}
])
這里的例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533247.html
標籤:mongodb聚合
