2016-05-14 13 views
2

Ich bin neu in MongoDB Welt.Erhalte die Aufzeichnung eines anderen Feldes mit Aggregat

Ich habe folgende Daten in meiner Sammlung

{ 
    "_id" : ObjectId("5735d8d4d147aa34e440988f"), 
    "DeviceLogId" : "26962", 
    "DeviceId" : "10", 
    "UserId" : "78", 
    "LogDateTime" : ISODate("2016-05-12T07:52:44.000+0000") 
} 
{ 
    "_id" : ObjectId("5735d8d4d147aa34e4409890"), 
    "DeviceLogId" : "26963", 
    "DeviceId" : "10", 
    "UserId" : "342", 
    "LogDateTime" : ISODate("2016-05-12T07:54:09.000+0000") 
} 
{ 
    "_id" : ObjectId("5735d8d4d147aa34e4409891"), 
    "DeviceLogId" : "26964", 
    "DeviceId" : "10", 
    "UserId" : "342", 
    "LogDateTime" : ISODate("2016-05-12T07:54:10.000+0000") 
} 
{ 
    "_id" : ObjectId("5735d8d4d147aa34e4409892"), 
    "DeviceLogId" : "26965", 
    "DeviceId" : "10", 
    "UserId" : "78", 
    "LogDateTime" : ISODate("2016-05-12T07:54:27.000+0000") 
} 

I DeviceId jeden Benutzer mit maximal LogDateTime mit Gruppe abfragen mag.

Ich habe Gruppe von Abfrage wie unten geschrieben, aber habe keine Ahnung, wie würde ich DeviceLogId für jeden Datensatz bekommen.

collectionName.aggregate(
     [{ 
      $match: { LogDateTime: { $gt: todaysDateStart, $lt: todayDateEnd } } 
     }, { 
      $group: { 
       _id: "$UserId", 
       maxPunchTime: { $max: { $add: [ "$LogDateTime", 330*60000 ] } }, 
      } 
     }]) 

In MSSQL, kann ich es einfach mit verschachtelter Abfrage, aber ich habe keine Ahnung, wie ich das in MongoDB erreichen würde.

Vielen Dank im Voraus.

Antwort

2

Verwenden Sie die $addToSet Group Accumulator:

collectionName.aggregate(
    [{ 
     $match: { LogDateTime: { $gt: todaysDateStart, $lt: todayDateEnd } } 
    } 
    , { 
     $group: { 
      _id: "$UserId", 
      maxPunchTime: { $max: { $add: [ "$LogDateTime", 330*60000 ] } },    
      deviceLogIds:{$addToSet: "$DeviceLogId"} //<---- 
     } 
    } , 
    { $sort: {"maxPunchTime" : -1} } , {$limit : 1} //Sort Descending + Limit to 1 
    ]) 
+0

Ich will nicht gesetzt von 'DeviceLogId'. Ich will nur eine 'DeviceLogId' mit maximaler' LogDateTime'. – shashwat

+0

Haben Sie den Code getestet, den ich Ihnen gegeben habe? – Atchoum

+0

Ja, ich habe es versucht. Es gibt mir eine Reihe von 'DeviceLogIDs'. Ich habe keine Ahnung, welche man auswählt. – shashwat

0

Add deviceid auf ein Array in Gruppenphase

Device:{$addToSet:deviceId} 
Verwandte Themen