2015-11-22 3 views
1

У меня есть три разных агрегата, которые я хотел бы объединить с одним.Объедините три разных агрегата в один один

objsCount = self.db.bidding.aggregate([ 
    { "$group": { 
     "_id": "$bid_item", 
     "number_of_objects": { "$sum": 1 } 
    }} 
]) 

objsPrice = self.db.bidding.aggregate([ 
    {"$match": {"$and" : [{"price": {"$ne":"null"}},{"users":{"$ne":"null"}}]}}, 
    { "$group": { 
     "_id": "$bid_item", 
     "total_price": { "$sum": '$price' }, 
     "total_users": { "$sum": '$users' } 
    }} 
]) 

objsHigestBid = self.db.bidding.aggregate([ 
    {"$match": {"$and" : [{"highestBid": {"$ne":"null"}},{"users":{"$ne":"null"}}]}}, 
    { "$group": { 
     "_id": "$bid_item", 
     "total_number_of_users_after_bid": { "$sum": '$highestBid' } 
    }} 
]) 

Выход Я ищу это:

[{ _id : '', 
    number_of_objects : '', 
    total_price : '', 
    total_users : '', 
    total_number_of_users_after_bid : '' 
},...] 

Как я могу изменить свои «агрегаты» на один сингл «агрегат», которые делают это возможным?

+0

Вы хотите на '$ match' в вашем первом запросе? – styvane

+0

... будет ли ваш второй запрос возвращать ожидаемый результат, если «upperBid» не равен нулю? будет ли ваш последний запрос работать, если «цена» не равна нулю? – styvane

+0

Очень хорошие вопросы @ user3100115. «Вы хотите сопоставить $ в своем первом запросе?» - Нет, «.. ваш второй запрос возвращает ожидаемый результат, если« maximumBid »не null? Будет ли ваш последний запрос работать, если« цена »не равна нулю?» - Да и Да – Mikael

ответ

0

С одной $group трубопровода, вы можете воспользоваться оператором $cond на стадии трубопровода, чтобы оценить счетчики, основанные на логике указанного, что-то вроде следующего:

db.bidding.aggregate([  
    { 
     "$group": { 
      "_id": "$bid_item",    
      "number_of_objects": { "$sum": 1 }, 
      "total_price": { 
       "$sum": { 
        "$cond": [ { "$ne": [ "$price", "null" ] }, "$price", 0 ] 
       } 
      }, 
      "total_users": { 
       "$sum": { 
        "$cond": [ { "$ne": [ "$users", "null" ] }, "$users", 0 ] 
       } 
      }, 
      "total_number_of_users_after_bid": { 
       "$sum": { 
        "$cond": [ 
         { 
          "$and": [ 
           { "$ne": [ "$highestBid", "null" ] }, 
           { "$ne": [ "$users", "null" ] } 
          ] 
         }, 
         "$highestBid", 0 
        ] 
       } 
      } 
     } 
    } 
]) 
Смежные вопросы