2016-12-04 48 views
0

這是我的樣本document.I有很多這樣的文件,其中Cpe.Srno是一個關鍵和Cpe.date不斷得到使用API​​這個MongoDB Aggregate有什麼問題?

{ 
    "_id": "8NH5rNCz47fyoo3z2", 
    "Cpe": { 
     "Srno": "GZDBDt2NmpMv54j", 
     "date": { 
      "$date": "2016-12-04T14:51:26.452Z" 
     } 
    }, 
    "serialNumber": 4.703961341e+09, 
    "Device": { 
     "object_id": 1, 
     "terminal_id": 3, 
     "Info": { 
      "FirmwareVersion": { 
       "value": "5.9.2" 
      }, 
      "Model": { 
       "value": "lunus Rustic HRK paxton - 989" 
      }, 
      "DeviceSerialNumber": { 
       "value": 3.830919496e+09 
      }, 
      "BatteryType": { 
       "value": "Handcrafted lithium battery" 
      }, 
      "SavedPriority": { 
       "value": 7 
      } 
     } 
    } 
} 

我想按Cpe.Srno並獲得使用Cpe.date。所以我最近的文檔更新得到不同的Cpe.Srno並且只有最新的文件。

我停留在集團stage.This是我的代碼

db.AllDevices.aggregate([ 
    { $sort: { "Cpe.date": -1 } }, 
    { 
     $group: { 
      _id: "$Cpe.Srno", 
      "latest": { $first: "$Cpe.date" } 
     } 
    }, 
]) 

,這是我的結果

{ "_id" : "qst3pnS3EQi8uHb", "latest" : ISODate("2016-12-04T14:51:26.487Z") } 
{ "_id" : "Ur45SS1I3Yaji2p", "latest" : ISODate("2016-12-04T14:51:26.513Z") } 
{ "_id" : "9ZZXVVEAQ5pA9Ax", "latest" : ISODate("2016-12-04T14:51:26.518Z") } 

我需要得到整個數據,所有的域(我只得到兩個領域)。我檢查了$推,$addToSet.They似乎並不適合我。 我在哪裏錯了,或者我錯過了什麼。

$group

db.AllDevices.aggregate([ 
    { $sort: { "Cpe.date": -1 } }, 
    { 
     $group: { 
      _id: "$Cpe.Srno", 
      "latest": { $first: "$Cpe.date" } 
     } 
    }, 
    { 
     $project: { 
      Srno: "$_id", 
      datetag: "$latest", 
      _id: 0 
     } 
    }, 
    { $match: { "Cpe.Srno": "$Srno", "Cpe.date": "$datetag" } } 
]) 

不工作試過$match

回答

0

您可以使用$$ROOT整個文檔,然後項目,$arrayElemAt挑選最新的推動。

aggregate([{ 
    $sort: { 
     "Cpe.date": -1 
    } 
}, { 
    $group: { 
     _id: "$Cpe.Srno", 
     "fields": { 
      $push: "$$ROOT" 
     } 
    } 
}, { 
    $project: { 
     "latest": { 
      $arrayElemAt: ["$fields", 0] 
     } 
    } 
}])