結果に表示されている内容は正しいです。あなたのアプローチは少し間違っています。期待する結果が必要な場合は、次のアプローチを使用する必要があります。
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
これにより、次の出力が得られるはずです。
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
aggregation
を使用しているときはいつでも MongoDBで、期待するドキュメントを生成する集約パイプラインを作成する場合は、常に最初のステージからクエリを開始する必要があります。そして、最終的にステージを追加して、後続のステージからの出力を監視します。
$unwind
の出力 ステージは次のようになります:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
ここで、使用した3番目のステージを含めると、greetings
と一致します。 値が{hello:"world"}
のキー その正確な値を使用すると、パイプラインで2つのドキュメントのみが検出されます。したがって、次のようになります:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }