title: MongoDB multiply values inside two arrays
body: <p>I need help with multiplying values in an array of objects to get an output.</p>
  
  <p>Here is my JSON</p>
  
  <pre><code>/* 1 */
  {
      "_id" : ObjectId("5b919a785cb288f7d5311846"),
      "nome" : "Antonio",
      "cod_produtor" : "PR001",
      "morada" : {
          "rua" : "Rua dos Carvalhos",
          "n_porta" : 12.0,
          "cod_postal" : "4567-123"
      },
      "data-registo" : ISODate("2017-07-22T03:41:20.201+0000"),
      "colheita" : {
          "cod_colheita" : "COL001",
          "ano" : 2018.0,
          "tipo_maça" : "Ambrosia",
          "precario" : [ 
              {
                  "valor" : "0-60",
                  "preço" : 0.1
              }, 
              {
                  "valor" : "60-65",
                  "preço" : 0.12
              }, 
              {
                  "valor" : "65-70",
                  "preço" : 0.15
              }, 
              {
                  "valor" : "70-75",
                  "preço" : 0.17
              }, 
              {
                  "valor" : "75-80",
                  "preço" : 0.2
              }, 
              {
                  "valor" : "80+",
                  "preço" : 0.23
              }, 
              {
                  "valor" : "85-90",
                  "preço" : 0.25
              }, 
              {
                  "valor" : "90+",
                  "preço" : 0.3
              }, 
              {
                  "valor" : "DEFEITO",
                  "preço" : 0.05
              }
          ],
          "Lote" : {
              "Número Lote" : "FE9450H",
              "Peso" : 4495.0,
              "calibragem" : [ 
                  {
                      "valor" : "0-60",
                      "quantidade" : 22.0
                  }, 
                  {
                      "valor" : "60-65",
                      "quantidade" : 224.0
                  }, 
                  {
                      "valor" : "65-70",
                      "quantidade" : 624.0
                  }, 
                  {
                      "valor" : "70-75",
                      "quantidade" : 1183.0
                  }, 
                  {
                      "valor" : "75-80",
                      "quantidade" : 1424.0
                  }, 
                  {
                      "valor" : "80+",
                      "quantidade" : 911.0
                  }, 
                  {
                      "valor" : "85-90",
                      "quantidade" : 45.0
                  }, 
                  {
                      "valor" : "90+",
                      "quantidade" : 6.0
                  }, 
                  {
                      "valor" : "DEFEITO",
                      "quantidade" : 54.0
                  }
              ],
              "TOTAL" : 4493.0,
              "DIFERENÇA" : -2.0
          }
      }
  }
  
  /* 2 */
  {
      "_id" : ObjectId("5b91a8f65cb288f7d5311b50"),
      "nome" : "João",
      "cod_produtor" : "PR002",
      "morada" : {
          "rua" : "Rua dos Travessas",
          "n_porta" : 169.0,
          "cod_postal" : "9871-456"
      },
      "data-registo" : ISODate("2016-12-24T08:43:20.201+0000"),
      "colheita" : {
          "cod_colheita" : "COL005",
          "ano" : 2018.0,
          "tipo_maça" : "Golden",
          "precario" : [ 
              {
                  "valor" : "0-60",
                  "preço" : 0.1
              }, 
              {
                  "valor" : "60-65",
                  "preço" : 0.12
              }, 
              {
                  "valor" : "65-70",
                  "preço" : 0.15
              }, 
              {
                  "valor" : "70-75",
                  "preço" : 0.17
              }, 
              {
                  "valor" : "75-80",
                  "preço" : 0.2
              }, 
              {
                  "valor" : "80+",
                  "preço" : 0.23
              }, 
              {
                  "valor" : "85-90",
                  "preço" : 0.25
              }, 
              {
                  "valor" : "90+",
                  "preço" : 0.3
              }, 
              {
                  "valor" : "DEFEITO",
                  "preço" : 0.05
              }
          ],
          "Lote" : {
              "Número Lote" : "FE1283961",
              "Peso" : 1234.0,
              "calibragem" : [ 
                  {
                      "valor" : "0-60",
                      "quantidade" : 22.0
                  }, 
                  {
                      "valor" : "60-65",
                      "quantidade" : 101.0
                  }, 
                  {
                      "valor" : "65-70",
                      "quantidade" : 223.0
                  }, 
                  {
                      "valor" : "70-75",
                      "quantidade" : 183.0
                  }, 
                  {
                      "valor" : "75-80",
                      "quantidade" : 424.0
                  }, 
                  {
                      "valor" : "80+",
                      "quantidade" : 11.0
                  }, 
                  {
                      "valor" : "85-90",
                      "quantidade" : 5.0
                  }, 
                  {
                      "valor" : "90+",
                      "quantidade" : 6.0
                  }, 
                  {
                      "valor" : "DEFEITO",
                      "quantidade" : 54.0
                  }
              ],
              "TOTAL" : 1029.0,
              "DIFERENÇA" : 205.0
          }
      }
  }
  
  /* 3 */
  {
      "_id" : ObjectId("5b91a9855cb288f7d5311b72"),
      "nome" : "Antonio",
      "cod_produtor" : "PR001",
      "morada" : {
          "rua" : "Rua dos Carvalhos",
          "n_porta" : 12.0,
          "cod_postal" : "4567-123"
      },
      "data-registo" : ISODate("2017-07-22T03:41:20.201+0000"),
      "colheita" : {
          "cod_colheita" : "COL001",
          "ano" : 2017.0,
          "tipo_maça" : "Ambrosia",
          "precario" : [ 
              {
                  "valor" : "0-60",
                  "preço" : 0.1
              }, 
              {
                  "valor" : "60-65",
                  "preço" : 0.12
              }, 
              {
                  "valor" : "65-70",
                  "preço" : 0.15
              }, 
              {
                  "valor" : "70-75",
                  "preço" : 0.17
              }, 
              {
                  "valor" : "75-80",
                  "preço" : 0.2
              }, 
              {
                  "valor" : "80+",
                  "preço" : 0.23
              }, 
              {
                  "valor" : "85-90",
                  "preço" : 0.25
              }, 
              {
                  "valor" : "90+",
                  "preço" : 0.3
              }, 
              {
                  "valor" : "DEFEITO",
                  "preço" : 0.05
              }
          ],
          "Lote" : {
              "Número Lote" : "FE9450H",
              "Peso" : 1000.0,
              "calibragem" : [ 
                  {
                      "valor" : "0-60",
                      "quantidade" : 50.0
                  }, 
                  {
                      "valor" : "60-65",
                      "quantidade" : 150.0
                  }, 
                  {
                      "valor" : "65-70",
                      "quantidade" : 200.0
                  }, 
                  {
                      "valor" : "70-75",
                      "quantidade" : 250.0
                  }, 
                  {
                      "valor" : "75-80",
                      "quantidade" : 150.0
                  }, 
                  {
                      "valor" : "80+",
                      "quantidade" : 100.0
                  }, 
                  {
                      "valor" : "85-90",
                      "quantidade" : 45.0
                  }, 
                  {
                      "valor" : "90+",
                      "quantidade" : 15.0
                  }, 
                  {
                      "valor" : "DEFEITO",
                      "quantidade" : 40.0
                  }
              ],
              "TOTAL" : 1000.0,
              "DIFERENÇA" : 0.0
          }
      }
  }
  
  /* 4 */
  {
      "_id" : ObjectId("5b91ab8c5cb288f7d5311bed"),
      "nome" : "Antonio",
      "cod_produtor" : "PR001",
      "morada" : {
          "rua" : "Rua dos Carvalhos",
          "n_porta" : 12.0,
          "cod_postal" : "4567-123"
      },
      "data-registo" : ISODate("2017-07-22T03:41:20.201+0000"),
      "colheita" : {
          "cod_colheita" : "COL001",
          "ano" : 2017.0,
          "tipo_maça" : "Ambrosia",
          "precario" : [ 
              {
                  "valor" : "0-60",
                  "preço" : 0.1
              }, 
              {
                  "valor" : "60-65",
                  "preço" : 0.12
              }, 
              {
                  "valor" : "65-70",
                  "preço" : 0.15
              }, 
              {
                  "valor" : "70-75",
                  "preço" : 0.17
              }, 
              {
                  "valor" : "75-80",
                  "preço" : 0.2
              }, 
              {
                  "valor" : "80+",
                  "preço" : 0.23
              }, 
              {
                  "valor" : "85-90",
                  "preço" : 0.25
              }, 
              {
                  "valor" : "90+",
                  "preço" : 0.3
              }, 
              {
                  "valor" : "DEFEITO",
                  "preço" : 0.05
              }
          ],
          "Lote" : {
              "Número Lote" : "FE9450H",
              "calibragem" : [ 
                  {
                      "valor" : "0-60",
                      "quantidade" : 50.0
                  }, 
                  {
                      "valor" : "60-65",
                      "quantidade" : 150.0
                  }, 
                  {
                      "valor" : "65-70",
                      "quantidade" : 200.0
                  }, 
                  {
                      "valor" : "70-75",
                      "quantidade" : 250.0
                  }, 
                  {
                      "valor" : "75-80",
                      "quantidade" : 150.0
                  }, 
                  {
                      "valor" : "80+",
                      "quantidade" : 100.0
                  }, 
                  {
                      "valor" : "85-90",
                      "quantidade" : 45.0
                  }, 
                  {
                      "valor" : "90+",
                      "quantidade" : 15.0
                  }, 
                  {
                      "valor" : "DEFEITO",
                      "quantidade" : 40.0
                  }
              ],
              "TOTAL" : 1000.0,
              "DIFERENÇA" : 0.0
          }
      }
  }
  </code></pre>
  
  <p>and what i need to do is multiply the values <code>colheita.precario</code> with <code>colheita.Lote.calibragem</code> to get a sum of them. inside <code>colheita.precario</code> you have the <code>valor</code> and <code>preço</code> and inside <code>colheita.Lote.calibragem</code> you have <code>valor</code> and <code>quantidade</code>. The field <code>valor</code> must match and then multiply <code>preço</code> * <code>quantidade</code></p>
  
  <p>Actually i have two different approaches. But none of them is working.
  I was thinking in something like this:</p>
  
  <p><em>USING STUDIO 3T</em></p>
  
  <p><strong>Stage 1 - match</strong></p>
  
  <p>Here i need to match to different things</p>
  
  <pre><code>{
      "cod_produtor" : "PR001", 
      "colheita.ano" : 2017
  }
  </code></pre>
  
  <p><strong>Stage 2 - project</strong></p>
  
  <pre><code>{
      // specifications
      _id : "$colheita.Lote.Número Lote",
      total: {
          $sum:[
              { 
                  "$multiply": [
                      "$colheita.precario.0.preço", 
                      "$colheita.Lote.0.quantidade"
                  ] 
              },
              { 
                  "$multiply" : [
                      "$colheita.precario.1.preço", 
                      "$colheita.Lote.1.quantidade"
                  ] 
              }
          ]
     }
  }
  </code></pre>
  
  <p>But this is not working because it gives an error: </p>
  
  <blockquote>
    <p>"The <code>$sum</code> accumulator is a unary operator"</p>
  </blockquote>
  
  <p>Really thankfull for your help</p>