2017-11-25 1 views
0

MongoDb에서 특정 조건에서만 조회를 수행 할 수 있습니까? 이벤트가 내 MongoDb에서 발생해야하며 이벤트가 특정 사용자가 관련 베팅을 추가 한 경우에만 - 컬렉션에 베팅을 추가하고 싶습니다.특정 조건에서 조회 수행 방법

먼저 이벤트와 관련된 베팅을 얻기 위해 Match 연산자와 $ lookup을 사용했지만 문제는 두 번째 조건을 정의해야합니다. 베팅의 사용자 식별자는 외부 매개 변수 (userId)의 값과 동일해야합니다.

그럼 컬렉션이 아닌 하나의 결과 만 추가하면됩니다. 그래서 내가 $ 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을 사용할 수 있습니다. 이 방법을 사용하면 배열을 평면으로 표현할 수 있습니다. 즉, 두 개의 배열 항목이있는 문서가 하나있는 경우 두 개의 문서가 동일한 필드와 이름으로 만들어지며 배열 이름 만 다릅니다.

그런 다음 $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 
    } 
]) 

는 희망이 도움이 :

그래서 집계 파이프 라인은 다음과 같을 것이다.

관련 문제