2016-05-26 2 views
1

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

Например:

{ 
    label: "label1", 

    A: [0, 0, 0], 
    B: [1, 1, 1], 
    C: [0, 0, 1], 

    etc: ... , 
} 

необходимо будет произвести следующий суммированный массив во время проекции, или другой подобный массив при группировке на метку ключа дальше вниз по трубопроводу:

{ 
    Z: [1, 1, 2] 
} 

Использование Монго 3.2 Я могу размотать массив и сохранить его индексы, но я все еще не уверен, как перестроить массив, используя эти индексы и значения.

Если у кого есть какие-либо идеи или предложения, это будет означать много. Заранее спасибо за любые ответы.

+0

Какой максимальный размер может иметь массив? – profesor79

ответ

1

Можно использовать $ slice для массива среза, если он является небольшим размером (3x3 означает 9 операций), но разматывание будет генерировать 27 документов для массивов 3x3, поэтому подключение их обратно является своего рода болью.

или вы могли бы использовать более простое решение с использованием Foreach

var arraySize=3; 
var a=[]; 
db.david.find({label:"label2"}).forEach(function(myDoc) {  
     for(var i=0;i<arraySize;i++){ 
      a[i]=myDoc.A[i]+myDoc.B[i]+myDoc.C[i]; 
     } 
     }) 
printjson(a) 

редактировать

Я до сих пор не уверен, как кусать это более динамично - но это своего рода предложение для 3 массивов по 3 элемента каждый.

var arraySumprojection = { 
      $project : { 
       col1 : { 
        $let : { 
         vars : { 
          a : { 
           "$arrayElemAt" : ["$A", 0] 
          }, 
          b : { 
           "$arrayElemAt" : ["$B", 0] 
          }, 
          c : { 
           "$arrayElemAt" : ["$C", 0] 
          }, 

         }, 
         in : { 
          $add : ["$$a", "$$b","$$c"] 
         } 
        } 
       }, 

       col2 : { 
        $let : { 
         vars : { 
          a : { 
           "$arrayElemAt" : ["$A", 1] 
          }, 
          b : { 
           "$arrayElemAt" : ["$B", 1] 
          }, 
          c : { 
           "$arrayElemAt" : ["$C", 1] 
          }, 

         }, 
         in : { 
          $add : ["$$a", "$$b","$$c"] 
         } 
        } 
       }, 
       col3 : { 
        $let : { 
         vars : { 
          a : { 
           "$arrayElemAt" : ["$A", 2] 
          }, 
          b : { 
           "$arrayElemAt" : ["$B", 2] 
          }, 
          c : { 
           "$arrayElemAt" : ["$C", 2] 
          }, 

         }, 
         in : { 
          $add : ["$$a", "$$b","$$c"] 
         } 
        } 
       }, 
      } 
     } 
    ]) 
+0

Спасибо за понимание! Если мое понимание верное, метод forEach (...) применяется только к курсору после конвейера агрегации, поэтому я не мог использовать этот метод, если суммирование по массивам было промежуточным шагом. Я буду играть с ним и посмотреть, не сделаю ли я прогресса. –

+0

@ DavidB Каков максимальный размер массива? – profesor79

+0

@ Professor79 В массивах всего 28 элементов –

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