2016-07-12 8 views
1

2つのコレクションがあり、両方からフィールドを取得したいので、集約パイプラインで$lookupを使用しています。

これは正常に動作し、0または1要素(オブジェクト)を持つ配列の余分なフィールドを持つすべてのドキュメントを返します。 0要素の場合は、JOIN(SQLワールド内)が何も返さなかったことを意味します。 1要素の場合は、2番目のコレクションのフィールドを持つオブジェクトに要素と要素が一致したことを意味します。

私はこれらの結果を得ましたので、結果の一部をフィルタリングするために$matchを使用したいと思います。

$matchを使用するには、まず配列を抽出するために新しい追加フィールドに$unwindを使用します。問題は、一度$unwindステージを挿入すると、クエリの結果は単一のドキュメントです。

どうしてですか?どのように$unwind$match私は$lookupステージから得たすべての文書ですか?

答えて

2

たちはlookup後に書類を持っていると仮定します。

{doc:{_id:1, lookupArray:[{doc:1},{doc:2}]}} 

{doc:{_id:2, lookupArray:[/* empty */]}} 

ときに我々我々が取得するオプションなし$unwind

  1. {ドキュメントを:{_ ID:1、 lookupArray:{doc:1}}}
  2. {doc:{_ id:1 、lookupArray:{DOC:2}}}
  3. ヌル

我々は

{ $unwind: { path: "$array", preserveNullAndEmptyArrays: true } } 

を指定するときに我々が得る:

  1. {docの:{_ ID:1、 lookupArray:{doc:1}}}
  2. {doc:{_ id:1、lookupArray:{doc:2}}}
  3. {doc:{_ id:2、lookupArray:[/ * empty * /]} }

ですから、次のようになりますlookupArray、$matchから値ドキュメントの検索を実行する場合:

{$match:{'lookupArray.doc':2}} 

すべてのコメント大歓迎!

+0

'$ lookup'を実行したいが、条件でフィルタリングしたい場合はどうすればいいですか?そのようにして、新しく作成されたフィールドでは1(または0)の結果しか得られませんでした。それとも別の言葉で言えば、新しいフィールドに複数のオブジェクトがある場合、そのフィールドをフィルタリングしてオブジェクトを 'doc:2'のままにする方法はありますか? – alexandernst

+0

あなたは '$ project'を使って文書の形を操作できます - これがあなたの答えに印をつけてくれたら: – profesor79

+0

心配しないで、私はあなたの答えに印をつけます。 '$ project'を使ってどうやってやるのか少し説明できますか? – alexandernst

関連する問題