かなり古い質問ですが、文字通り提案された答えはどれも良いものではありません。
TLDR :
$projectステージで$elemMatchを使用することはできません。ただし、$filterなどの他の集計演算子を使用しても同じ結果を得ることができます。
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
また、$ elemMatchと同様に条件に一致する配列の最初の項目だけが必要な場合は、$ arrayElemAt
を組み込むことができます。詳細な説明 :
まず、$ elemMatchについて理解しましょう:
$ elemMatchはクエリ式ですが、このプロジェクションバージョンも存在します。これは、$project集約ステージではなくクエリプロジェクションを参照します。
だから何?これは何かと何の関係がありますか? $ projectステージには特定の入力構造がありますが、使用したいのは次のとおりです。
<フィールド>:<式>
有効な式とは何ですか?
式には、フィールドパス、リテラル、システム変数、式オブジェクト、および式演算子を含めることができます。式はネストできます。
したがって、式演算子を使用したいのですが、ドキュメントの$elemMatch
からわかるように その一部ではありません。したがって、集計$project
で使用するのは有効な式ではありません。 ステージ。