2015-10-15 4 views
0

Так вот образец документа в моей коллекции MongoDB:MongoDB PHP запрос в документах с вложенными объектами

{ 
    "_id" : ObjectId("561e0de61c9218b7bf9877c3"), 
    "Date" : NumberLong(20151014), 
    "Hour" : NumberLong(10), 
    "ProductId" : ObjectId("5614ba9c2e131caa098b4567"), 
    "ProductName" : "Test", 
    "ProducerId" : ObjectId("5617802151f8adf4db329d52"), 
    "ProducerName" : "Producer", 
    "ProducerRate" : NumberLong(300), 
    "ProducerMedium" : "Emailer", 
    "TotalLead" : NumberLong(6), 
    "VerifiedLead" : NumberLong(3), 
    "UnverifiedLead" : NumberLong(2), 
    "UnQualifiedLead" : NumberLong(1), 
    "TotalEarning" : NumberLong(660), 
    "Consumers" : [ 
     { 
      "ConsumerId" : ObjectId("5617802151f8adf4db329d54"), 
      "ConsumerName" : "Consumer1", 
      "ConsumedRate" : NumberLong(120), 
      "ConsumedLead" : NumberLong(3), 
      "Earning" : NumberLong(360) 
     }, 
     { 
      "ConsumerId" : ObjectId("5617802151f8adf4db329d58"), 
      "ConsumerName" : "Consumer2", 
      "ConsumedRate" : NumberLong(100), 
      "ConsumedLead" : NumberLong(3), 
      "Earning" : NumberLong(300) 
     } 
    ] 
} 

Теперь я хочу, чтобы получить ConsumedLead сгруппированные по ConsumerId и ProductID из базы данных в PHP.

то, что я сделал до сих пор, чтобы дать мне TotalLead и VerifiedLead сгруппированы по идентификатору продукта, но понятия не имею, как получить consumerbased результаты для таких же:

$keyf = new MongoCode('function(doc) {  
       return {\'ProductId\': doc.ProductId,\'ProductName\': doc.ProductName}; 
     }'); 
     $initial = array('TotalLead'=>0,'VerifiedLead'=>0); 

     $reduce = "function(obj, prev) { 
     prev.TotalLead += obj.TotalLead; 
     prev.VerifiedLead += obj.VerifiedLead; 

     }"; 
     $result = $collection->group($keyf, $initial, $reduce); 
     var_dump($result); 

Любая помощь пожалуйста.

EDIT: ожидаемый результат wpuld быть:

{ [0]=> array(4) { ["ProductId"]=> object(MongoId)#8 (1) { ["$id"]=> string(24) "5614ba9c2e131caa098b4567" } ["ProductName"]=> string(4) "Test" ["ConsumerId"]=> object(MongoId)#8 (1) { ["$id"]=> string(24) "5617802151f8adf4db329d58" } ["ConsumedLead"]=> float(4) } } 

ответ

1

Решение состоит в том, чтобы использовать aggregation framework где операция включает в себя $unwind оператор стадии начального трубопровода, как это будет деконструировать поле Consumers массива из вводит документы и выводит документ для каждого элемента. Каждый выходной документ заменяет массив значением элемента. Это позволит затем для аккумулятора оператора $sum группы на этапе $group работать и, таким образом, givies вам требуется ConsumedLead сгруппированы по ConsumerId и ProductId:

db.collection.aggregate([ 
    { 
     "$unwind": "$Consumers" 
    }, 
    { 
     "$group": { 
      "_id": { 
       "ProductId": "$ProductId", 
       "ConsumerId": "$Consumers.ConsumerId" 
      }, 
      "TotalConsumedLead": { 
       "$sum": "$Consumers.ConsumedLead" 
      } 
     } 
    } 
]) 

Запуск этой операции агрегации на примере выше приведет:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : { 
       "ProductId" : ObjectId("5614ba9c2e131caa098b4567"), 
       "ConsumerId" : ObjectId("5617802151f8adf4db329d58") 
      }, 
      "TotalConsumedLead" : NumberLong(3) 
     }, 
     { 
      "_id" : { 
       "ProductId" : ObjectId("5614ba9c2e131caa098b4567"), 
       "ConsumerId" : ObjectId("5617802151f8adf4db329d54") 
      }, 
      "TotalConsumedLead" : NumberLong(3) 
     } 
    ], 
    "ok" : 1 
} 

Так ваш окончательный рабочий aggregation in PHP должно быть:

$pipeline = array( 
    array('$unwind' => '$Consumers'), 
    array(
     '$group' => array(
      '_id' => array(
       'ProductId' => '$ProductId', 
       'ConsumerId' => '$Consumers.ConsumerId', 
      ), 
      'TotalConsumedLead' => array(
       '$sum' => '$Consumers.ConsumedLead' 
      ), 
     ) 
    ), 
); 

$out = $collection->aggregate($pipeline ,$options); 
+1

спасибо, что сработало отлично :) – Nero

+0

@Nero Awesome, рад, что помогло :-) – chridam

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