2013-11-22 2 views
0

Я новичок в mongoDb и сталкивается с проблемой при использовании функции агрегата. Я пытаюсь получить сумму полей «ожидания» и «общий», но возвращает 0. Я также хочу взять общее количество комментариев, которые не являются пустыми или нулевыми в одном и том же запросе.MongoDb Проблема с функцией агрегации с php

$out = $collection->aggregate 
(
    array(   
     array('$match' => array('id' => 6200)), 
      array ('$unwind' => '$reviews'), 
       array('$group' => array('_id' => '$id', 
        'exptotal' => array('$sum' => array('reviews' => '$expectations')),     
        'total' => array('$sum' => array('reviews' => '$overall')),     
        'count' => array('$sum' => 1) 
        ) 
      ) 
     ) 

); 

Вот JSON

{ 
"_id": "528c62406a542f7c6a6bf522", 
"id": 6200, 
"categories": [ 
    { 
     "id": 6, 
     "name": "Artificial Intelligence" 
    }, 
    { 
     "id": 5, 
     "name": "Statistics and Data Analysis" 
    } 
], 
"courseId": "COURSE_16", 
"institute": { 
    "id": 5693, 
    "name": "YZ University" 
}, 
"instructors": [ 
    " A Morris" 
], 
"language": "en", 
"reviews": [ 
    { 
     "username": "kalis", 
     "expectations": 3, 
     "content": 2, 
     "overall": 3, 
     "comments": "This is really good course for improvement", 
     "datecreated": "2013-11-02T17:04:11.102Z" 
    }, 
    { 
     "username": "julia", 
     "expectations": 4, 
     "content": 2, 
     "overall": 2, 
     "comments": "This improves my skill a lot", 
     "datecreated": "2013-11-03T17:04:11.102Z" 
    }, 
    { 
     "username": "john", 
     "expectations": 2, 
     "content": 4, 
     "overall": 4, 
     "comments": "", 
     "datecreated": "2013-11-04T17:04:11.102Z" 
    } 
], 
"shortName": "ml", 
"title": "Machine Learning" 

}

ответ

0

Это выглядит, как это будет работать:

$out = $collection->aggregate(array(
    array('$match' => array('id' => 6200)), 
    array ('$unwind' => '$reviews'), 
    array('$unwind' => '$comments'), 
    array('$group' => array('_id' => '$id', 
     'commTotal' => array('$sum' => array('$cond'=>array(array('$eq'=>array('$comments',null),0,1)))), 
     'exptotal' => array('$sum' => '$reviews.expectations'), 
     'total' => array('$sum' => '$reviews.overall'), 
     'count' => array('$sum' => 1) 
    )) 
)); 

Причина заключается в том, что когда вы $unwind данные по-прежнему в его поддокумент - это просто, что поддокумент стал объектом одного обзора.

Документация немного вводит в заблуждение на этом операторе. Я дам вам это.

+0

Спасибо, что сработало отлично !. Также, если я хочу взять общее количество комментариев, которые не являются пустыми или нулевыми в одном запросе? –

+0

@MarkGreen Вы можете сделать два раза, ваш образец не отображает поле комментариев, поэтому я догадываюсь, но если вы сделаете два раза, он будет эффективно раскручивать оба фила для вас, а затем вы сможете подвести итог двум частям , – Sammaye

+0

@MarkGreen добавил что-то из образца – Sammaye

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