ノードでこれを行うようにマングースを設定していませんが、2.2の新しい集計フレームワークを使用して必要な結果を取得することもできます-これは、必要な結果を取得する例です。まず、私のサンプルドキュメントは次のようになります。
> db.foo.findOne()
{
"_id" : ObjectId("50472eb566caf6af6108de02"),
"items" : [
1,
2,
3,
45,
4,
67,
9,
4
]
}
あなたが望むものに到達するために、私はこれをしました:
> db.foo.aggregate(
{$match : {"_id": ObjectId("50472eb566caf6af6108de02")}},
{$unwind : "$items"},
{$match : {"items": {$in : [1, 67, 9]}}},
{$group : {_id : "$_id", items : { $push : "$items"}}},
{$project : {_id : 0, items : 1}}
)
{
"result" : [
{
"_id" : ObjectId("50472eb566caf6af6108de02"),
"items" : [
1,
67,
9
]
}
],
"ok" : 1
}
説明するために、詳細に私はそれを一行ずつ取り上げます:
{$match : {"_id": ObjectId("50472eb566caf6af6108de02")}}
これはかなり明白です-これは基本的に通常のクエリの検索基準と同等であり、結果は処理されるパイプラインの次のステップに渡されます。インデックスなどが使える一枚です。
{$unwind : "$items"}
これにより、配列が分解され、配列の要素ごとに1つずつドキュメントのストリームが作成されます。
{$match : {"items": {$in : [1, 67, 9]}}}
この2番目の一致では、リスト内のドキュメントのみが返され、基本的にドキュメントのストリームが3つの結果セットに削減されます。
{$group : {_id : "$_id", items : { $push : "$items"}}}
出力を配列にしたいので、グループ化するキーとして_idを使用して、必要なアイテムを選択したので、上記のアンワインドを元に戻す必要があります。注:複数の一致がある場合、これには繰り返し値があります。一意のリストが必要な場合は、$addToSet
代わりに使用します$push
{$project : {_id : 1, items : 1}}
最後に、このプロジェクションは実際には必要ありませんが、機能を説明するために含めました。必要に応じて、_idを返さないように選択することもできます。