2014-01-21 2 views
0

Прежде чем я начну, я хочу сказать, что никаких других ответов на подобные вопросы применительно к этому вопросу не было. Сначала рассмотрим следующую JSON кодСовокупность сумм для MongoDB через NodeJS

"_id": "1412302013-01-20,11:32:22" 
    "display": [ 
    { 
     "Name": "LOG-11-05-SH-O1.mp4", 
     "Type": "Startup", 
     "Count": 2, 
     "Detail": [ 
     { 
      "Start": "2013-01-20,11:32:22", 
      "End": "2013-01-20,11:32:30" 
     }, 
     { 
      "Start": "2013-01-20,11:32:22", 
      "End": "2013-01-20,11:32:30" 
     } 
     ] 
    }, 
    { 
     "Name": "PUR-12-47-SH-X3.mp4", 
     "Type": "Movie", 
     "Count": "2", 
     "Detail": [ 
     { 
      "Start": "2013-01-20,11:32:22", 
      "End": "2013-01-20,11:32:30" 
     }, 
     { 
      "Start": "2013-01-20,11:32:22", 
      "End": "2013-01-20,11:32:30" 
     } 
     ] 
    }, 

Идентификатор в основном сочетание ряда номерного знака concatted с отметкой времени. То, что я пытаюсь сделать, это суммировать сумму для "Count", где "Name": "LOG-11-05-SH-O1.mp4".

Я не мог даже получить простые суммы для агрегирования, поэтому попытка агрегировать эту сумму была невозможна. При запуске моего скрипта в NodeJS я либо получаю undefined, либо [object Object].

У меня нет ни малейшего представления о том, что происходит неправильно, поскольку я слежу за различными онлайн-примерами.

После попытки использовать ответ Парвин в ниже, я все еще получаю неопределенными:

collection.aggregate([ 
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}}, 
    {$unwind : "$display"}, 
    {$group : {_id : "$_id", 
       name : {$first : "$display.Name"}, 
       total : {$sum : "$display.Count"} 
       } 
    }], function(err, result) { 
    console.log("Aggregation: " + result.total); 
}); 

Я пытался форматировать код, как эти docs.

ответ

2

result параметр The aggregate CallBack является массив, не одно значение. Вы можете увидеть это, если вы просто выливать result:

console.log(result); 

Таким образом, доступ total первого док в массиве:

console.log(result[0].total); 

Но это будет 0, потому что Count в ваш документ является строка, а не число. Вы не можете использовать строки $sum.

Потому что вы только хотите, total только для "Name": "LOG-11-05-SH-O1.mp4" элементов, вам нужно добавить еще один фильтр после вашего $unwind:

collection.aggregate([ 
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}}, 
    {$unwind : "$display"}, 
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}}, 
    {$group : {_id : "$_id", 
       name : {$first : "$display.Name"}, 
       total : {$sum : "$display.Count"} 
       } 
    }], function(err, result) { 
     console.log(result); 
}); 
+0

Интересно ... так что '$ sum' на самом деле не дает мне суммы, заставляя меня создавать цикл, чтобы добавить все значения массива. – krikara

+0

@krikara Правильный способ исправить это - изменить ваши данные так, чтобы 'Count' - число, а не строка. – JohnnyHK

+0

Да, я просто изменил счет на фактическое число. Но это все еще не сумма, поэтому мне все еще нужен цикл. Я думаю, это то, что меня больше смутило, потому что в оболочке Монго это была фактически сумма. Но NodeJS просто берет каждое отдельное значение и сохраняет его в массиве. – krikara

1

Вы можете использовать следующий запрос, чтобы найти общее количество для Name = "LOG-11-05-SH-O1.mp4". Это Java-пример, вы должны преобразовать его в node.js

db.collection.aggregate(
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}}, 
    {$unwind : "$display"}, 
    {$group : {_id : "$_id", 
       name : {$first : "$display.Name"}, 
       total : {$sum : "$display.Count"} 
    }} 
) 
+0

Это не работает для меня, я получаю следующее сообщение об ошибке. 'TypeError: объект не является функцией'. Я также попытался добавить 'function (err, count) {', а также поместить его в формат массива, но он все еще не работает. – krikara

+0

Я обновил свой JSON выше. Код агрегации «суммирует» весь отображаемый «Count», но я искал сумму всех «Count», где «Имя»: «LOG-11-05-SH-O1.mp4». Возможно ли это? – krikara

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