次のドキュメント構造があると仮定します。
> db.logs.find()
{
'id': ObjectId("50ad8d451d41c8fc58000003")
'name': 'Sample Log 1',
'uploaded_at: ISODate("2013-03-14T01:00:00+01:00"),
'case_id: '50ad8d451d41c8fc58000099',
'tag_doc': {
'group_x: ['TAG-1','TAG-2'],
'group_y': ['XYZ']
}
},
{
'id': ObjectId("50ad8d451d41c8fc58000004")
'name': 'Sample Log 2',
'uploaded_at: ISODate("2013-03-15T01:00:00+01:00"),
'case_id: '50ad8d451d41c8fc58000099'
'tag_doc': {
'group_x: ['TAG-1'],
'group_y': ['XYZ']
}
}
> db.cases.findOne()
{
'id': ObjectId("50ad8d451d41c8fc58000099")
'name': 'Sample Case 1'
}
との一意の組み合わせごと$match
に最新のものだけを取得する集約フレームワークを実行する方法はありますか? これは複数のパイプラインで実行できると確信していますが、可能な限り、オペレーターを介してパイプラインを通過するドキュメントの数をすぐに制限したいと考えています。で使用される以外は、演算子のようなものを考えています。Log
case_id
group_x
$group
$match
$max
$match
どんな助けでも大歓迎です。
編集:
これまでのところ、次のことを思いつくことができます。
db.logs.aggregate(
{$match: {...}}, // some match filters here
{$project: {tag:'$tag_doc.group_x', case:'$case_id', latest:{uploaded_at:1}}},
{$unwind: '$tag'},
{$group: {_id:{tag:'$tag', case:'$case'}, latest: {$max:'$latest'}}},
{$group: {_id:'$_id.tag', total:{$sum:1}}}
)
前述したように、複数の$group
パイプラインを使用して目的を達成できますが、多数のドキュメントを処理する場合、これはコストがかかることがわかります。そういうわけで、できるだけ早くドキュメントを制限したかったのです。
編集:
私はまだ良い解決策を思い付いていないので、ドキュメント構造自体が私のユースケースに最適化されていないかどうかを考えています. 達成したいことをサポートするためにフィールドを更新する必要がありますか? 提案は大歓迎です。
編集:
私は実際にSQLで別の列によってMAX(列値)、DISTINCTで行を選択するにはどうすればよいですか?で期待されるものと同様のmongodbの実装を探しています ただし、2 つの異なるフィールド値が含まれます。また、$match
一致するタグまたは日付の範囲内のフィルターを使用して、結果のセットが動的になるため、この操作は非常に重要です。
編集:
私のユースケースは複雑であるため、単純な類推を使用しようとしましたが、これは紛らわしいことがわかりました。上記は、実際のユースケースの簡略化された形式です。私が作成した混乱をお詫び申し上げます。