2016-11-01 3 views
0

У меня есть требование, чтобы уменьшить количество дб вызовов mongo.and выполнения присоединяется принести результат в одном вызове запросаМонго Db Multiple коллекция LookUp

У меня есть структура вроде этого

{ 
    "_id": ObjectId("5818c26ca3329829945a14da"), 
    "brandId": "SHOP", 
    "type": "SHOP", 
    "BrandDetails": { 
     "channelList": ["Chn1", "Chn2", "Chn3", "Chn4", "Chn5"], 
     "status": "approved", 
     "categoryList ": ["RETAIL"] 
    } 
} 
"rewards": { 
    { 
     "rewardType": "SHOP", 
     "rewardId": "rwd1", 
     "brandId": "SHOP", 
     "RewardDetails": { 
      "channelNameForReward": [ 
       "chn1" 
      ] 
     }, 
     "status": "approved", 
    }, 
    { 
     "rewardType": "SHOP", 
     "rewardId": "rwd2", 
     "brandId": "SHOP", 
     "RewardDetails": { 
      "channelNameForReward": [ 
       "chn1" 
      ] 
     }, 
     "status": "approved", 
    } 
} 

запроса:

db.brand.aggregate(
    // Pipeline 
    [ 
     // Stage 1 
     { 
      $match: { 
       "type": "SHOP" 
      } 
     }, 

     // Stage 2 
     { 
      $match: { 
       "State": "Approved" 
      } 
     }, 

     // Stage 3 
     { 
      $match: { 
       "BrandDetails.channelList": "chn1" 
      } 
     }, 

     // Stage 4 
     { 
      $match: { 
       "BrandDetails.categoryList": "RETAIL" 
      } 
     }, 

     // Stage 5 
     { 
      $lookup: { 
       "from": "reward", 
       "localField": "brandId", 
       "foreignField": "brandId", 
       "as": "rewards" 
      } 
     }, 

     // Stage 6 
     { 
      $unwind: "$rewards" 

     }, 

     // Stage 7 
     { 
      $match: { 
       "rewards.rewardType": "SHOP" 
      } 
     }, 

     // Stage 9 
     { 
      $match: { 
       "rewards.processState": "Approved" 
      } 
     }, 

     // Stage 6 
     { 
      $unwind: "$rewards.channelNameForReward" 

     }, 

     // Stage 10 
     { 
      $match: { 
       "rewards.channelNameForReward": "Chn1" 
      } 
     } 
    ] 
); 

для одного бренда я могу иметь несколько вознаграждений при выполнении $ lookup и $ unwind operation. Я получаю результат, но не в свободном формате

, когда я делаю, как это я получаю ответ, как этот

бренд Ид BrandDetails ... награды: reward1 бренда идентификаторов BrandDetails ... награды: reward2

я кроме ответа, как этот

бренд id BrandDetails ... награды: red1, rewd2

ответ

0

На основании предоставленной вами информации. Вы можете попробовать что-то вроде этого. Вы можете обновить запрос в соответствии с вашими полями, но идея состоит в том, чтобы сгруппировать идентификатор бренда в конце и надавить на награды. Вы можете объединить все матчи, а также не нужно разматывать награды в конце.

db.brand.aggregate([{ 
    $match: { 
     "type": "SHOP", 
     "State": "Approved", 
     "BrandDetails.channelList": "Chn1", 
     "BrandDetails.categoryList": "RETAIL " 
    } 
},{ 
    $lookup: { 
     "from": "reward", 
     "localField": "brandId", 
     "foreignField": "brandId", 
     "as": "rewards" 
    } 
}, { 
    $match: { 
     "rewards.rewardType": "SHOP", 
     "rewards.processState": "Approved", 
     "rewards.RewardDetails.channelNameForReward": "chn1" 
    } 
}, { 
    $group: { 
     _id: { 
      brandId: "$brandId", 

     }, 
     myrewards: { 
      $push: "$rewards" 
     } 
    } 
}]); 
+0

Спасибо за ответ, после поиска я не кип, чтобы выполнить операцию поиска по результату. –

+0

как вы выполняете поиск? добавьте более подробную информацию к сообщению. – Veeram

Смежные вопросы