要進行維度查詢,您需要在摘要文檔中保留這些屬性(假設它們不是太多,因爲它們應該被編入索引,這會減慢寫入的速度)。
因此,假設一個文件:
{
"UserId": ObjectId(""),
"FullName":"Joe Shmoe",
"Location":"Michigan",
"SummaryDate": ISODate("2014-09-01T04:00:00Z"),
TotalViews: 34,
Points: 300,
Growth: 20.3
}
要做到基於狀態的第二查詢將是這樣的:
在密歇根州(任選的其它屬性過濾器)的所有用戶,並告訴我他們的統計6月,7月和8月按7月份的統計數據排序。
db.collection.aggregate([
{"$match":{
"Location":"Michigan",
"SummaryDate":{"$gt":ISODate("2014-06-01T04:00:00Z"), "$lt":ISODate("2014-09-01T04:00:00Z")}
} },
{"$group": {
"_id":"$UserId",
"Full Name":{$first:"$FullName"},
"Location":{$first:"$Location"},
"June views": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},6]},then:"$TotalViews",else:0}}},
"June growth": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},6]},then:"$Growth",else:0}}},
"July views": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},7]},then:"$TotalViews",else:0}}},
"July growth": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},7]},then:"$Growth",else:0}}},
"Aug views": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},8]},then:"$TotalViews",else:0}}},
"Aug growth": {$sum:{$cond:{if:{$eq:[{$month:"$SummaryDate"},8]},then:"$Growth",else:0}}},
} },
{"$sort":{"July views":1} }
]);
輸出將文件是這樣的樣本名單:
{
"_id" : ObjectId("543445dd19b404b29e503f94"),
"Full Name" : "Jane Shmoe",
"Location" : "Michigan",
"June views" : 0,
"June growth" : 0,
"July views" : 40,
"July growth" : 20.3,
"Aug views" : 340,
"Aug growth" : 20.3
}
做排序的維查詢你需要或者保持在摘要中的文件,這些屬性(如果沒有太多請記住它們應該被編入索引,這會減慢寫入的速度)*或*您可能會查詢用戶標識的相應屬性,然後僅查詢您希望的用戶標識的彙總集合,但如果您有例如,來自密歇根州的數百萬用戶。我會建議保留摘要文檔中的屬性。 – 2014-10-07 15:39:23
謝謝。我看到的唯一問題是分頁和排序。如果他們要對用戶過濾的數據進行排序很容易,但是如果他們在統計信息列上進行排序,則會按照第一批用戶中包含的用戶進行排序。 – 2014-10-07 19:09:10
似乎是[MongoDB的聚集管道]的候選人(http://docs.mongodb.org/manual/core/aggregation-introduction/)。 – zamnuts 2014-10-07 19:14:04