2017-02-03 9 views
0

特定の条件に一致する列の最終値を取得したいと考えました。 $last$condを使用すると、ほぼ常に$condの3番目のパラメータが表示されます。MongoDB集計最後の項目の一致条件

例:私は

{uid:1,subject:"Maths",name:"Assignment 1",s_date:"2017-01-15 00:00:00"} 
{uid:1,subject:"Maths",name:"Assignment 2",s_date:"2017-01-17 00:00:00"} 
{uid:2,subject:"Maths",name:"Assignment 1",s_date:"2017-01-16 00:00:00"} 
{uid:1,subject:"Science",name:"Assignment 1",s_date:"2017-01-11 00:00:00"} 

次のレコードを持っている私は、各被験者の最後の割り当てが提出された日を見つけるためにグループにこれらの項目を望んでいました。ユーザーのための最後のレコードが、私は常に出力としてnullを取得します「サイエンス」などの対象を持っていない場合、私は何をしようとしていたことは、この場合、

collection.aggregate(
    { 
     $group: { 
     _id: '$uid', 
     science: { 
      $last: { 
       $cond: [ 
        { $eq: ['$subject','Science'] }, 
        '$u_date', 
        null 
       ] 
      } 
     } 
    } 
) 

ました。

(私はこれはこれは、仮想的な例である_id:{'uid':'$uid','subject':'$subject'}.をグループ化することによって行うことができます知っている。私の実際のレコードセットは、もう少し複雑です。

私は

{_id:{uid:1,subject:"Science"},'s_date':'2017-01-11 00:00:00'} 
で最終的な出力をしたくないので、ご了承ください

フォーマットが、

{_id:1,science:'2017-01-11 00:00:00',maths:'2017-01-14 00:00:00'} 

形式)。

別の方法でお手伝いしてください。私は$filter$setDifferenceを使用すると考えましたが、それはレコードセットが膨大でクエリがシステムによって動的に生成されるため、より複雑になります。

答えて

0

$ groupを2回使用できます。

collection.aggregate([ 
    { $sort: { s_date: -1 } }, 
    { $group: { 
    _id: { uid: '$uid', subject: '$subject' }, 
    s_date: { $last: '$s_date' }, 
    } }, 
    { $group: { 
    _id: '$_id.uid', 
    s_dates: { $push: { subject: "$_id.subject", s_date: "$s_date" } }, 
    } }, 
]) 

結果:

{ 
    _id: 1, 
    s_dates: [ 
    { subject: 'Maths', s_date: '2017-01-17 00:00:00' }, 
    { subject: 'Science', s_date: '2017-01-11 00:00:00' }, 
    ], 
} 
{ 
    _id: 2, 
    s_dates: [ 
    { subject: 'Maths', s_date: '2017-01-16 00:00:00' }, 
    ], 
} 
+0

私は質問で述べたように、これらのフィールドに基づいて、複数のフィールドと、複数の条件があるので、私は、件名に基づいてグループ化を使用することはできません。これが、なぜuidとsubjectで直接グループ化するのではなく、$ condを使用する主な理由です。 –

+0

あなたは何をしようとしているのか分かりません。あなたは、uidとsubjectによってグループ分けされ、次にuidによってグループ化されない場合の例を挙げることができますか? –

+0

たとえば、Userイベントをコレクションに格納しているとします。複数のイベントとイベントに関連する異なるフィールドがあります。例:ユーザーがログインしたイベントがあります。フィールドには時刻が記録され、ユーザーがフィールドとして費やした額のユーザー購入イベントがあります。 1週間以内にログインして10ドル以上購入したユーザーのリストを取得する集計クエリを作成する必要があります。 (仮説再度) –

関連する問題