2016-11-01 217 views
0

我有一定的要求,以降低分贝数调用mongo.and执行连接带来的结果在一个查询电话蒙戈Db的多个集合查找

我有结构这样

{ 
    "_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操作时我得到的结果,但不是例外格式

个 当我做这样我得到的反应是这样

品牌标识BrandDetails

...奖励:reward1 品牌标识BrandDetails ...奖励:reward2

我正在响应除外这样

品牌id BrandDetails ...奖励:red1,rewd2

回答

0

根据您提供的信息。你可以尝试这样的事情。您可能想要更新查询以匹配您的字段,但想法是在最后对品牌ID进行分组,并推出奖励。你可以合并所有的比赛,并且我们也不需要在最后放松奖励。

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