1

2つのネストされた配列($ concatArraysを使用)を1つの新しいフィールドに連結しようとしています。私はオブジェクトの両方のセットに存在するプロパティによって連結(Model.timeline)の出力をソートしたいと思います。私は$ unwindで動作するように見えることはできません。並べ替えなしのクエリは次のとおりです。

Model.aggregate([ 
    { 
     $match: { 
      'id': id 
     } 
    }, 
    { 
     $project: { 
      id: 1, 
      name: 1, 
      flagged: 1, 
      updatedAt: 1, 
      lastEvent: { 
       $arrayElemAt: ['$events', -1] 
      }, 
      lastimage: { 
       $arrayElemAt: ['$images', -1] 
      }, 
      timeline: { 
       $concatArrays: [ 
        { $filter: { 
         input: '$events', 
         as: 'event', 
         cond: { $and: [ 
          { $gte: ['$$event.timestamp', startAt] }, 
          { $lte: ['$$event.timestamp', endAt] } 
         ]} 
        }}, 
        { $filter: { 
         input: '$images', 
         as: 'image', 
         cond: { $and: [ 
          { $gte: ['$$image.timestamp', startAt] }, 
          { $lte: ['$$image.timestamp', endAt] } 
         ]} 
        }} 
       ] 
      } 
     } 
    } 
]); 

明らかなものがありませんか?

答えて

0

マッチとプロジェクトの後に3つのパイプラインステージが必要です。最初に$unwind、次に$sort、そして次に$group。すべてのフィールドを保持するには、$first演算子を使用します。

{ 
    $undwind : "$timeline", 
}, 
{ 
    $sort : {"your.sortable.field" : 1} 
}, 
{ 
    $group : { 
     _id : "$_id", 
     name : {$first : 1}, 
     flagged : {$first : 1}, 
     updatedAt : {$first : 1}, 
     lastEvent : {$first : 1}, 
     lastimage : {$first : 1}, 
     timeline : {$push : "$timeline"} 
    } 
} 

これは、マッチフェーズ後に複数のドキュメントがある場合でも機能します。基本的に、これは各ドキュメント内の配列の要素をソートします。

0

あなたの$マッチと$プロジェクト集約の段階では、私が_ididを置換した後に働いた、とidstartAtendAtので、などのための値で埋め:

db.items.aggregate([ 
    { 
     $match: { 
      '_id': '58' 
     } 
    }, 
    { 
     $project: { 
      '_id': 1, 
      name: 1, 
      flagged: 1, 
      updatedAt: 1, 
      lastEvent: { 
       $arrayElemAt: ['$events', -1] 
      }, 
      lastimage: { 
       $arrayElemAt: ['$images', -1] 
      }, 
      timeline: { 
       $concatArrays: [ 
        { $filter: { 
         input: '$events', 
         as: 'event', 
         cond: { $and: [ 
          { $gte: ['$$event.timestamp', ISODate("2016-01-19T20:15:31Z")] }, 
          { $lte: ['$$event.timestamp', ISODate("2016-12-01T20:15:31Z")] } 
         ]} 
        }}, 
        { $filter: { 
         input: '$images', 
         as: 'image', 
         cond: { $and: [ 
          { $gte: ['$$image.timestamp', ISODate("2016-01-19T20:15:31Z")] }, 
          { $lte: ['$$image.timestamp', ISODate("2016-12-01T20:15:31Z")] } 
         ]} 
        }} 
       ] 
      } 
     } 
    } 
]);