パーティーに少し遅れましたが、うまくいけば、解決策を探している他の人を助けるでしょう。集約フレームワークを使用し、$projectと$unwindを$matchと組み合わせて、それらをチェーン化することにより、これを行う方法を見つけました。 PHPを使用して実行しましたが、要点を理解する必要があります:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
最初の一致とプロジェクトは、フィルターで除外して高速化するために使用されます。次に、サブコレクションでアンワインドすると、各サブコレクションがアイテムごとに吐き出され、最終的な一致を使用してフィルター処理できます。
お役に立てば幸いです。
更新(Ryan Whealeから):
その後、$group
を実行できます データを元の構造に戻します。 $elemMatch
を持っているようなものです 複数のサブドキュメントを返します:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
これをNodeからPHPに変換したので、PHPでテストしていません。誰かがノードバージョンを望んでいるなら、下にコメントを残してください、そして私は義務付けます。