MongoDB 将两个数组内的值相乘 [英] MongoDB multiply values inside two arrays
问题描述
我需要帮助将对象数组中的值相乘以获得输出.
I need help with multiplying values in an array of objects to get an output.
这是我的 JSON
/* 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
}
}
}
而我需要做的是将值 colheita.precario
与 colheita.Lote.calibragem
相乘以获得它们的总和.在 colheita.precario
里面你有 valor
和 preço
而在 colheita.Lote.calibragem
里面你有 勇气
和quantidade
.字段 valor
必须匹配然后乘以 preço
* quantidade
and what i need to do is multiply the values colheita.precario
with colheita.Lote.calibragem
to get a sum of them. inside colheita.precario
you have the valor
and preço
and inside colheita.Lote.calibragem
you have valor
and quantidade
. The field valor
must match and then multiply preço
* quantidade
实际上我有两种不同的方法.但他们都没有工作.我在想这样的事情:
Actually i have two different approaches. But none of them is working. I was thinking in something like this:
使用 STUDIO 3T
第 1 阶段 - 匹配
这里我需要匹配不同的东西
Here i need to match to different things
{
"cod_produtor" : "PR001",
"colheita.ano" : 2017
}
第 2 阶段 - 项目
{
// 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"
]
}
]
}
}
但这不起作用,因为它给出了错误:
But this is not working because it gives an error:
$sum
累加器是一元运算符"
"The
$sum
accumulator is a unary operator"
非常感谢您的帮助
推荐答案
您可以在 3.4 聚合中使用以下项目.
You can use below project in 3.4 aggregation.
$range
到在colheita.precario
内迭代$映射
和包含数组字段的输出值与 preco 和 quantidade 的乘法.
$range
to iterate over colheita.precario
inside$map
and output value containing array fields with multiplication of preco and quantidade.
$let
表达式使用索引(来自 $range
(ix) )输出 colheita.precario 和 Lote.calibragem 元素.
$let
expression with index ( from $range
(ix) ) to output the colheita.precario and Lote.calibragem element.
$project
with $sum
to output the sum of array values.
{
"$project":{"total":{
"$sum":{
"$map":{
"input":{"$range":[0,{"$size":"$colheita.precario"}]},
"as":"ix",
"in":{
"$let":{
"vars":{
"pre":{"$arrayElemAt":["$colheita.precario","$$ix"]},
"cal":{"$arrayElemAt":["$colheita.Lote.calibragem","$$ix"]}
},
"in":{"$multiply":["$$pre.preço","$$cal.quantidade"]}
}
}
}
}
}}
}
这篇关于MongoDB 将两个数组内的值相乘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!