2017-02-09 4 views
0

以内に最低値と最高値を取得:だから、それは基本的に異なるプロセスから複数のメッセージが含まれていグループのエントリと私はこれに似たデータを含むコレクション持つグループ

{ processName: "TestImport", processId: 1, message: "Started", time: 1486609206370 } 
{ processName: "TestImport", processId: 1, message: "Finished", 
time: 1486609207388 } 
{ processName: "TestImport", processId: 2, message: "Started", time: 1486779281773 } 
{ processName: "TestImport", processId: 2, message: "Finished", 
time: 1485992810029} 
{ processName: "SomeOtherImport", processId: 1, message: "Started", time: 1486779281773 } 
{ processName: "SomeOtherImport", processId: 1, message: "Finished", 
time: 1487993829281 } 

を。各プロセスは、processNameおよびそれに続くprocessIdによって識別されます。

今、最新のプロセスを選択するクエリを作成したいので、最もIDが高く、最も古いメッセージと最後のメッセージの時刻と最後のメッセージを返します。

私はaggregateを使用して、このようにそれをグループ化することによって、これに近いようになってきている:

db.status_history.aggregate([ 
    { 
     $group: { 
      _id: { 
       name: "$processName", 
       id: "$processId" 
      }, 
      processId: { 
       $last: "$processId" 
      }, 
      message: { 
       $last: "$message" 
      }, 
      startTime: { 
       $first: "$time" 
      }, 
      endTime: { 
       $last: "$time" 
      } 
     } 
    }]); 

しかし、このように、私は、各プロセスのための最高のIDを持つエントリを取得しないだけでなく、それぞれに1つのエントリID :(正しい値で):

{ processName: "TestImport", processId: 1, message: "Finished", startTime: 1486609206370, endTime: 1486609207388 } 
{ processName: "TestImport", processId: 2, message: "Finished", startTime: 1486779281773, endTime: 1485992810029 } 
{ processName: "SomeOtherImport", processId: 1, message: "Finished", startTime: 1486779281773, endTime: 1487993829281 } 

最高のIDのそれぞれの結果が得られるように変更する必要はありますか?このように:

{ processName: "TestImport", processId: 2, message: "Finished", startTime: 1486779281773, endTime: 1486923811716 } 
{ processName: "SomeOtherImport", processId: 1, message: "Finished", startTime: 1486779281773, endTime: 1487993829281 } 
+0

グループの前に '{$ sort:{" processId ": - 1、" timestamp ":1}}'を追加してみてください。 – Veeram

答えて

1

最初のグループは、名前とIDによってソートを適用した後、再度グループ名により、最初に一致した情報を選択することができる後。

db.status_history.aggregate([ 
    { 
     $group: { 
      _id: { 
       name: "$processName", 
       id: "$processId" 
      }, 
      processId: {$last: "$processId"}, 
      message: {$last: "$message"}, 
      startTime: {$first: "$time"}, 
      endTime: {$last: "$time"} 
     } 
    }, 
    {$sort:{"_id.name":1, "_id.id":-1}}, 
    { 
     $group: { 
      _id: "$_id.name", 
      processId: {$first: "$processId"}, 
      message: {$first: "$message"}, 
      startTime: {$first: "$startTime"}, 
      endTime: {$first: "$endTime"} 
     } 
    } 
]); 
関連する問題