我需要帮助将对象数组中的值相乘以获得输出。
这是我的 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 你有 勇气 和量化。字段 valor 必须匹配然后乘以 preço * quantidade
实际上我有两种不同的方法。但他们都没有工作。 我在想这样的事情:
使用 STUDIO 3T
第 1 阶段 - 比赛
这里我需要匹配不同的东西
{
"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"
]
}
]
}
}
但这不起作用,因为它给出了一个错误:
"The
$sumaccumulator is a unary operator"
非常感谢你的帮助
最佳答案
您可以在 3.4 聚合中使用以下项目。
$range在 $map 中迭代 colheita.precario和包含数组字段的输出值与 preco 和 quantidade 的乘积。
$let带有索引的表达式(来自 $range (ix) )以输出 colheita.precario 和 Lote.calibragem 元素。
{
"$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 将两个数组内的值相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52274806/
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>