我的文件看起來是這樣的:集團首先通過類別,然後按周或按月
{
category: "1",
timestamp: ISODate("2016-07-16T00:00:00.000Z"),
amount: 0
},
{
category: "1",
timestamp: ISODate("2016-08-18T00:00:00.000Z"),
amount: 15
},
{
category: "1",
timestamp: ISODate("2016-08-01T00:00:00.000Z"),
amount: 5
},
{
category: "2",
timestamp: ISODate("2016-08-18T00:00:00.000Z"),
amount: 10
}
現在我想第一組按類別(已工作):
{ "$match" : { "timestamp" : { "$gt" : FROM , "$lt" : TO }}},
{ "$sort" : { "timestamp" : 1 }},
{ "$group" : {
"_id" : "$category",
"data" : { "$push" : { "timestamp" : "$timestamp" , "amount" : "$amount" }}
}}
和然後將這些對象分組在data
陣列中。要獲得每週最高金額(或月 - 取決於用戶輸入)。
然後結果應該是這個樣子(按月分組時):
{
_id: "1",
data: [
{
timestamp: "2016-07", // could also be an ISODate with
amount: 0 // first (or last) day of month
}, // if that makes things easier
{
timestamp: "2016-08",
amount: 15
}
]
},
{
_id: "2",
data: [
{
timestamp: "2016-08",
amount: 10
}
]
}
我試圖unwind
的data
數組,然後再分組,但導致總共爛攤子。
希望你有一些很好的想法/解決方案來實現這個工作。
編輯:另一個問題:
我穿上category
這只是正常的$match
的索引。將timestamp
作爲排序索引也是有用的(因爲插入排序可能與時間戳排序有所不同),還是這個索引在聚合中不起作用?
哇!謝謝!我稍後會經過並嘗試。你有什麼意見在時間戳字段上創建索引進行排序? –
我根據您的代碼添加了自己的答案。它對集合本身進行分組,雖然不需要'group1'和'unwind'。但是現在'$ match'後面的'$ sort'沒有給出預期的結果。我無法解釋這種情況。儘管我在'$ group'階段之間放置了'$ sort'。 –