如下:
經過過濾后,再分組,兩個字段為分組條件。
但是,我只想獲取分組內時間,即fdate為最大的那條數(shù)據(jù)
如何能做到??
db.SEC_2018_05_12.aggregate([{ $match : { fyear : { $eq : 2018},fmonth:{$eq : 5},fday:{$eq : 12},fhour:{$eq : 17},fmin:{$eq : 8} } }
, { $group: { _id: {dev_id: "$dev_id", data_id: "$data_id"},maxTimeValue: { $max: "$fdate" } } } ]).pretty()如果能給些測試條件別人會更容易理解你的問題。
首先說$eq,這個運算符大部分時候沒有必要寫。所以你的查詢等價于:
db.SEC_2018_05_12.aggregate([
{ $match : { fyear : 2018, fmonth: 5, fday: 12, fhour: 17, fmin: 8 } },
{ $group: { _id: {dev_id: "$dev_id", data_id: "$data_id"}, maxTimeValue: { $max: "$fdate" } } } ]).pretty()
然后你的要求是取到第一條數(shù)據(jù),而不僅僅是最大那個fdate值??梢該Q個思路來理解這個問題:
按dev_id asc, data_id asc, fdate desc三者來排序,然后取每個分組的第一條數(shù)據(jù)
按照這個思路,查詢應該是:
db.SEC_2018_05_12.aggregate([
{ $match : { fyear : 2018, fmonth: 5, fday: 12, fhour: 17, fmin: 8 } },
{ $sort: { dev_id: 1, data_id: 1, fdate: -1} },
{ $group: { _id: {dev_id: "$dev_id", data_id: "$data_id"}, maxDoc: { $first: "$$ROOT" } } } ]).pretty()
最后說說數(shù)據(jù)模型設計的問題。$match這里其實就是一個時間,但是被你拆成了很多部分來存儲。除非有明確的理由支持,個人并不是十分贊成這樣的做法。
$match/$sort需要索引的支持,所以原來一個索引現(xiàn)在將會變成5個字段的聯(lián)合索引,同樣是浪費空間和效率;在數(shù)據(jù)量大的情況下,上面的查詢是需要索引支持的。換你現(xiàn)在的寫法,索引應該是:
{
fyear: 1,
fmonth: 1,
fday: 1,
fhour: 1,
fmin: 1,
dev_id: 1,
data_id: 1,
fdate: -1
}
看上去就夠驚悚了不是嗎?但其實前面那一堆時間本身只是一個時間而已。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。