MongoDB 将两个数组内的值相乘

2024-03-06

我需要帮助将对象数组中的值相乘以获得输出。

这是我的 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 with colheita.Lote.calibragem得到它们的总和。里面colheita.precario你有valor and preço和里面colheita.Lote.calibragem你有valor and quantidade。场valor必须匹配然后相乘preço * quantidade

实际上我有两种不同的方法。但它们都不起作用。 我在想这样的事情:

使用工作室 3T

第一阶段 - 比赛

这里我需要匹配不同的东西

{
    "cod_produtor" : "PR001", 
    "colheita.ano" : 2017
}

第二阶段 - 项目

{
    // 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 $sum累加器是一元运算符”

真的很感谢你的帮助


您可以在 3.4 聚合中使用以下项目。

$range https://docs.mongodb.com/manual/reference/operator/aggregation/range/迭代colheita.precario inside$map https://docs.mongodb.com/manual/reference/operator/aggregation/map/以及包含 preco 和 quantidade 相乘的数组字段的输出值。

$let https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/带索引的表达式 ( from$range(ix) ) 输出 colheita.precario 和 Lote.calibragem 元素。

$project https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/ with $sum https://docs.mongodb.com/manual/reference/operator/aggregation/sum/输出数组值的总和。

{
  "$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"]}
          }
        }
      }
    }
  }}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 将两个数组内的值相乘 的相关文章

  • 查找聚合中的管道在 mongodb 中不起作用

    我是 mongodb 的新手 所以我希望这不会成为一个非常基本的问题 我做了一些研究 并试图应用我所发现的东西 但有些东西似乎让我忽略了 我有两个以下格式的集合 Shop shopId 1002 shopPosId 10002 descri
  • 猫鼬模式创建

    我刚刚开始使用猫鼬 我有一个使用 mongoose 的创建脚本 它使用示例数据创建模式和数据库 现在我编写实际的应用程序 我是否需要在每次应用程序运行时创建架构对象 或者它是否已经以某种方式可用 换句话说 我是否需要在每个使用 mongoo
  • MongoDB 删除 MapReduce 集合

    由于客户端代码中的错误 mongodb 创建了许多 mr mapreduce 集合 如何将它们全部删除 可能通过掩码 我在交互式 shell 中运行脚本 function f var names db getCollectionNames
  • Spring Mongo Populator 一一

    我在 Kotlin 上使用 MongoDB 和 Spring 并且希望我的应用程序在启动时填充 MongoDB 集合 并在每次启动时清理 我的问题是 如果我填充的某些数据有问题 如何才能一一填充数据以便容错 my code Configur
  • MongoDB:如何使用单个命令更新多个文档?

    我惊讶地发现以下示例代码仅更新单个文档 gt db test save id 1 foo bar gt db test save id 2 foo bar gt db test update foo bar set test success
  • 在 MongoDB 中查找 7 天前的记录

    我有一个包含对象的集合 如下所示 1 id ObjectId 551c6605e4c6ac495c923aab sender id ObjectId 551c6605e4c6ac495c923aac rep sender id 38 sen
  • 如何决定使用哪种NoSQL技术? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 MongoDB 基于文档 HBase 基于列 和 Neo4j 对象图 的优缺点是什么 我特别有兴趣了解
  • Mongoose 查询:删除“_id”属性,在结果中保留虚拟属性“id”

    我正在运行 Express js 应用程序 并且有以下设置 模型 js var schemaOptions toJSON virtuals true toObject virtuals true var modelSchema new mo
  • 如何更改 MongoDB 用户权限?

    例如 如果我有这个用户 gt db system users find user testAdmin pwd some hash roles clusterAdmin otherDBRoles TestDB readWrite 我想给那个用
  • Mongodb 限制聚合查询中的数组

    我正在尝试编写一个查询来返回每个类别中的前 X 个术语 例如前 5 个 前 10 个等 每个术语都有一个关联的类别 并且基于另一个术语的帮助堆栈溢出问题 https stackoverflow com questions 25666187
  • MongoDB 复合键:InvalidOperationException:{document}.Identity 不受支持

    我在水合由复合 ID 组成的类时遇到问题 该复合 ID 又具有基类 我收到一条错误消息InvalidOperationException document Identity is not supported 我试图写入数据库的类如下 pub
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • 如何使用 Stripe 在一次操作中创建客户和卡片?

    我正在尝试第一次初始化客户 我有一个表格 他们可以在那里注册和填写所有内容 然后他们提交 在客户端上 会发生以下情况 var cardValues AutoForm getFormValues credit card form insert
  • Mongodb - 为现有集合添加架构

    我的 MongoDB 中有一个包含 1300 万条记录的集合 不幸的是 当我创建这个集合时 没有为其创建模式 我想知道除了备份整个数据库 创建架构并上传所有数据之外 是否有任何方法可以添加 JSON 架构 您可以使用以下方法将 JSON 架
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • Mongoose.js instance.save() 回调未触发

    var mongo require mongoose var connection mongo createConnection mongodb 127 0 0 1 test connection on error function err
  • 使用填充方法在 sails mongo 中进行深层关联?

    我是 sails js 的新手 我正在使用 sails js 与 Mongodb 我在我的 sails 应用程序中使用 populate 进行深层关联时遇到问题 我有这样的关系 Category has many to many relat
  • MongoDB:检查值是否为空或数组是否为空

    我想匹配所有不包含 公司 属性或 公司 值为空或空数组的文档 User find Company in null function err users if err throw err console log users length th
  • 管理员未授权 Mongodb 执行 listDatabases 命令

    删除 mongodb 用户后 无法重新连接 mongo 没有 验证 我创造了超级用户 https docs mongodb org v2 6 reference built in roles superuser roles tomuser
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la

随机推荐

  • jinja2:渲染模板而不扩展

    如何在不扩展的情况下渲染模板 我有简单的渲染器 我想在发现这个请求是ajax后只渲染目标数据 我的模板 extends base html load i18n block extrahead endblock extrahead block
  • 超级开发模式重新编译后未检测到更改

    我设置了新的 Eclipse 工作区并从 SVN 下载了项目 我启动了超级开发模式 gwt 2 7 0 chrome 浏览器 当尝试重新编译时 它显示 跳过编译 因为没有输入文件已更改 它在旧工作区中运行良好 但在新工作区中则不然 我使用相
  • Laravel 与数据表:搜索加密数据

    我在使用 Laravel 数据表时遇到了一个很大的问题 我有一个模型 它有 3 个由 setter getter 自动加密 使用 Crypt 的值 我正在使用数据表来渲染表格 return datatables gt of Patient
  • 如何使用 HTML5 将网络摄像头捕获的 jpg 图像/视频保存在本地硬盘中

    问题看似简单 但我找不到合适的解决方案 因为我缺乏 HTML 和 Javascript 知识 任务只是设计一个网页 其中的按钮将激活网络摄像头并将静态图像或视频 最好 存储在本地硬盘驱动器中 暂时不需要上传 下载 经过一番尝试 我可以使用
  • Intellij-idea 反向粘贴到字符串中(又名从字符串复制)?

    在 Intellij idea 中 如果您将一些文本粘贴到字符串文字中 在双引号之间 java 编辑器可以自动重新格式化粘贴的文本 即为双引号新行等放置必要的转义字符 我想做相反的事情 即当从字符串文字内部复制文本时 编辑器将干净的文本放置
  • 使用 Lambda 代理集成的 Step Functions 和 Lambda

    我编写了一堆 Lambda 函数 这些函数通过 API Gateway 作为 Rest 端点公开 我选择了 Lambda 代理集成 因为它似乎是一种简单的入门方法 现在我想通过 AWS Step Functions 将其中 2 个函数链接在
  • C# 中的隐式数组转换

    我有以下定义了隐式转换运算符的类 class A class B private A m a public B A a this m a a public static implicit operator B A a return new
  • 谷歌地图获取半径

    我在使用这个谷歌地图 javascript 代码时遇到了愚蠢的困难 我想返回在谷歌地图上生成的圆的半径 Google API 提供了代码 但我不知道把它放在哪里 我到处都试过了 这是下面的代码 我做错了什么
  • java中多级继承中构造函数调用的顺序[重复]

    这个问题在这里已经有答案了 c07 Sandwich java Order of constructor calls package c07 import com bruceeckel simpletest import java util
  • spring错误没有JdbcTemplate类型的合格bean

    我有一个正在创建的 Spring Boot 应用程序Datasource and JdbcTemplate手动在我的配置中 因为我需要解密数据源密码 我正在使用 tomcatDataSource org apache tomcat jdbc
  • PUT 请求中的 100-Continue 是什么意思?

    我在某些 PUT 请求 上传文件 中看到 Expect 100 continue 这是什么意思 应该发生的情况是 您应该发送带有以下内容的请求标头 Expect 100 continue 标头 然后 在发送标头之后 发送有效负载之前 您应该
  • Xcode Beta3 中的 CMutablePointer 和 CConstPointer 发生了什么?

    Xcode Beta3 中的 CMutablePointer 和 CConstPointer 发生了什么 在 Beta2 中成功编译的代码失败并出现错误 Use of undeclared type CMutablePointer 分别使用
  • SetConsoleCtrlHandler例程问题

    我正在用 C 编写一个控制台应用程序 我使用 SetConsoleCtrlHandler 来捕获关闭和 CTRL C 按钮 这允许我的所有线程正确停止和退出 其中一个线程执行一些需要一些时间才能完成的保存 并且我有一些代码需要在控制台 cr
  • 动态函数列表并动态调用它们

    我希望能够将各种静态方法存储在列表中 然后查找它们并动态调用它们 每个静态方法都有不同数量的参数 类型和返回值 static int X int int static string Y int int string 我想要一个可以将它们全部
  • 如何在Android中获取远程设备自定义蓝牙名称?

    我想在 Android 中检索远程蓝牙设备的自定义名称 我说的是在 设置 蓝牙 和配对设备下的手机设置中找到的名称 例如 我有一个名为 DoorControl 的远程蓝牙设备 在 设置 gt 蓝牙 gt 配对设备 下 我已将设备重命名为 C
  • 为什么以及何时创建多模块 Maven 项目?

    我有一个关于 Maven 多模块项目的一般性问题 何时以及为什么要这样做 Esko Luontola 的回答 将项目拆分为多个模块很有用 例如 这些模块需要单独部署 可能会被误解 如果您有要单独部署的模块 则情况恰恰相反 在这种情况下 您永
  • 尝试让网络错误警报显示在 iPhone 应用程序上?

    好的 我正在尝试让这个应用程序显示网络错误警报代码 我添加了 SystemConfiguration framework 框架和 Apple 的 Reachability 示例代码 这是 viewcontroller h 文件 import
  • 使用一个查询更新多行?

    我在这里发现了一些可以更新一个字段的东西 http www karlrixon co uk articles sql update multiple rows with Different values and a single sql q
  • 将空格分隔的条目拆分为 R 中的新列

    我正在编写一项输出 csv 文件的调查 在此 csv 中 我有一些以空格分隔的条目 它们代表多选问题 例如具有多个答案的问题 最后 我想将这些空格分隔的条目解析到它们自己的列中 并为它们创建标题 这样我就知道它们来自哪里 例如 我可以从此开
  • MongoDB 将两个数组内的值相乘

    我需要帮助将对象数组中的值相乘以获得输出 这是我的 JSON 1 id ObjectId 5b919a785cb288f7d5311846 nome Antonio cod produtor PR001 morada rua Rua dos