2017-01-05 13 views
1

我々はggregateクエリ MongoDBの$lookupを使用する場合、我々は、オブジェクトの配列と我々は返すように$project段階で$arrayElemAtを使用する必要があるいくつかの時間としてuserリターン

{ 
    $lookup: 
    { 
     from: "users", 
     localField: "userId", 
     foreignField: "_id", 
     as: "user" 
    } 
} 

この形式を使用して、単一のオブジェクト。

{ 
    $project: 
    { 
    user: 
     { 
     $arrayElemAt: [ "$user", 0 ] 
     } 
    } 
} 

ようなので、私の質問は、私たちが代わりに配列$lookupからステージの単一のオブジェクトとしてuserを返すことができる方法ですか?

あなたはまだ $lookupと、それを行うためのクリーンな方法は次のように後から新たなステージを追加することですそれを行うことはできません
+0

[$ lookup](https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)は配列を返します。私はあなたが次の段階でそれを投影するよりも何か良いことをすることはできません。 –

+0

現在、次のステージで '$ project'を使用していますが、私は20以上のフィールドも投影する必要があります。 @AlexBlex –

+0

これは良いかもしれませんが、そうではありません。ルックアップは正確に1つの要素と一致すると仮定します。あなたのケースでは公正かもしれないので、このロジックを維持する最も良い場所は、パイプラインの次の段階であるユーザー空間です。この仮定がもはや成り立たない時点までアプリケーションが進化すると、照会を自分で変更し、一致する要素が2つ以上ある場合の対処方法を選択することができます。 –

答えて

0

{ 
    $unwind: "$user" 
} 

各文書はあなたがで終わるだけのユーザーを持っているので、同じコレクションですが、今回はユーザーがもはや配列ではありません。ドキュメントごとに複数のユーザーがいる場合(例2)、ユーザーごとに2つのドキュメントが作成されます。

関連する問題