2013-10-04 84 views
3

我有幾個記錄這樣MongoDB的總框架查詢,最大日

userid purchased brand 
1  2012-1-21 honda 
1  2013-1-1 toyota 
1  2013-2-30 mercedez 

2  2013-1-1 honda 
2  2012-1-1 toyota 
2  2013-12-13 mercedez 

我想要得到的用戶記錄,最大購買日期。像以下

1  2013-2-30 mercedez 
2  2013-12-13 mercedez 

我試圖用戶mongodb聚合框架工作,但有正確的查詢問題。

db.carsrecord.aggregate([{"$match" :{"userid":{"$in":[1,2,3,11]}}} , 
    {"$group":{"_id": {"uid":"$userid"},timecreated:{"$max":"$purchased" }}} ]) 

它返回我正確的隱藏和時間,但沒有返回汽車品牌。

"result" : [ 
    { 
     "_id" : { 
      "uid" : 1 
     }, 
     "timecreated" : ISODate("2013-10-03T20:01:45.366Z") 
    } 
], 
"ok" : 1 

感謝

回答

3

你必須使用$第一家運營商,看看這個問題,我的解釋回答:Get last documents with a distinct criteria

正確的代碼將是:

db.carsrecord.aggregate(
     [{"$match" :{"userid":{"$in":[1,2,3,11]}}} , 
     {"$sort": {userid:1, purchased:-1}}, 
     {"$group":{"_id": 
        {  "uid":"$userid" }, 
        "timecreated":{"$first":"$purchased" }, 
        "brand":{"$first":"$brand"}}} 
     ]) 
+0

感謝很多這個對我有用。 –

+0

也可以格式化輸出。此刻放出來就是這個樣子{ \t \t \t 「_id」:{ \t \t \t \t 「UID」:1 \t \t \t}, \t \t \t 「timecreated」:ISODate(「2013-10-03T20 :01:45.366Z「), \t \t \t」品牌「:豐田 \t \t}。相反,我想獲得{uid:1,timecreated:2013,品牌:「toyota」} –

+0

您可以運行額外的$項目階段...類似於:$ project:{uid:'$ _ id.uid',timecreate: {$ year:'$ timecreated'},品牌:1,_id:0}提取年份,你可以使用這個(我希望我使用正確的語法將在稍後測試):http://docs.mongodb.org/manual/reference/aggregation/operator-nav /#date-operators – attish