2017-11-25 9 views
0

MongoDbではルックアップを実行できますか?私はイベントを私のMongoDbから取得する必要があります。イベントが特定のユーザーによって追加された関連ベットを持っている場合にのみ、コレクションにベットを追加したいと思います。特定の条件でルックアップを実行する方法

最初に、イベントに関連した賭けを得るためにMatch演算子と$ lookupを使用しましたが、問題は2番目の条件を定義する必要があります - 賭けのユーザ識別子は外部パラメータ(userId)の値と同じでなければなりません。

次に、コレクションではなく、結果を1つだけ追加する必要があります。そのため、私は$ projectを使用しました。助けてください。

私のコードはここに行く:

  db.collection('events').aggregate([ 
       { 
        $match: { 
         'isDeleted': false, 
         'leagueId': ObjectID(leagueId) 
        } 
       }, 
       { 
        $lookup: { 
         from: "bets", 
         localField: "_id", 
         foreignField: "eventId", 
         as: "bets" 
        }, 
       }, 
       { 
        $project: { 
         _id: true, 
         home: true, 
         guest: true, 
         description: true, 
         result: true, 
         resultHome: true, 
         resultGuest: true, 
         startDate: true, 
         type: true, 
         specialPoints: true, 
         leagueStage: true, 
         createdDate: true, 
         updatedDate: true, 
         isDeleted: true, 
         isCalculated: true, 
         leagueId: true, 
         bet: { "$arrayElemAt": [ "$bets", 0 ] } 
       } 
      } 

答えて

1

んが、あなたが$lookupに条件を持っていないことはできません。しかし、次のことができます。 ルックアップの後に配列betsがあります。 $unwindを使用できます。 この方法で、配列のフラットな表現ができます。つまり、2つの配列エントリを持つ1つのドキュメントがある場合、同じフィールドと名前を持つ2つのドキュメントが作成され、配列のみが異なります。

さらに、$matchを使用して、必要なものだけを除外することができます。次に、文書を変更しない限り、$projectを使用する必要はありません。

db.getCollection('events').aggregate([{ 
     $match: { 
      'isDeleted': false, 
      'leagueId': ObjectID(leagueId) 
     } 
    }, 
    { 
     $lookup: { 
      from: "bets", 
      localField: "_id", 
      foreignField: "eventId", 
      as: "bets" 
     }, 
    }, 
    { 
     $unwind: "$bets" 
    }, 
    { 
     // match here again to only get the bet you need 
    } 
]) 

はそれが役に立てば幸い:

だからあなたの集約パイプラインは次のようになります。

関連する問題