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 将两个数组内的值相乘 的相关文章

  • 使用 Morphia 配置 Spring Boot?

    我不想利用 Spring DATA MongoDB 支持 我想利用名为 Morphia 的 MongoDB ORM https github com mongodb morphia https github com mongodb morp
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • Perl Mongo 查找对象 ID

    你会认为这是一件简单的事情 我有一个集合中的对象 ID 列表 我想根据对象 ID 获取单个记录 谷歌搜索过 但没有任何帮助 所以我有对象 ID 5106c7703abc120a04070b34 my client MongoDB Mongo
  • 重命名($project)数组中的字段 - MongoDB [重复]

    这个问题在这里已经有答案了 我有一个类似以下的文件 id 59ba903dacea50d0d7d47168 sections id 59d9dd7947ce651544c5d4c1 sectionName Section 1 id 59d9
  • MongoDB 使用 $sort、$skip 和 $limit 返回错误的行

    这是我正在使用的功能 MyModel aggregate match query sort createdAt 1 skip skip limit 10 allowDiskUse true query是过滤行 skip是基于分页的动态值 即
  • 从数组中查找前 N 个条目

    我的收藏结构如下 id 1 Trips EndID 5 Tripcount 12 EndID 6 Tripcount 19 id 2 Trips EndID 4 Tripcount 12 EndID 5 Tripcount 1
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • MongoDB 获取聚合查询中的第一个和最后一个文档

    我如何获得第一个和最后一个文档time场地 我可以用 group并得到 first and last文档 但我不需要在这里分组 只需获取第一个和最后一个完整文档 也许我可以用slice 此查询不起作用 aggregate 353469045
  • MongoDB 如何使用 $date 运算符进行查询?

    编辑 上下文 我正在使用 Talend ETL 工具 并在查询中使用 ISODate 或 Date 或 new Date 如下所示失败并出现错误 因此我需要解决方法 dt ISODate 2014 01 01 dt Date 2014 01
  • 显示来自 mongodb 的所有数据并在 doT.js 模板引擎中渲染它

    我想从 mongodb 中提取数据并将其传递给视图 一切似乎都正常 但我没有看到所有 10000 条记录都显示出来 而是只看到了一条 我觉得我非常接近解决它 但我陷入困境 我正在使用node mongodb native express和d
  • mongodb - 检索数组子集

    看似简单的任务对我来说是一个挑战 我有以下 mongodb 结构 services TCP80 data status 1 delay 3 87 ts 1308056460 status 1 delay 2 83 ts 1308058080
  • 使用mongoid动态创建索引

    我有一项为我的文档创建新字段的工作 我想在这项工作结束时创建该字段的索引 我试过 Model index field gt 1 and also Mongoid Sessions default rating prediction ensu
  • MongoDB 在仅返回 _id 时使用 COLLSCAN

    我想返回 MongoDB 集合中的所有 ID 我使用了以下代码 db coll find id 1 但MongoDB扫描整个集合而不是从默认读取信息index id 1 从日志中 find collection filter project
  • mongoDB白名单IP

    我看到类似的帖子 但没有一个能帮助我解决我的问题 在学习了从头开始构建 MERN 应用程序的 Udemy 教程后 我陷入了 mongoose 连接的困境 这是我的 index js 代码 const express require expr
  • 在 MongoDb 上序列化仅获取属性

    使用 C 6 我可以写 public class Person public Guid Id get public string Name get public Person Guid id string name Id id Name n
  • Spring Data MongoDB 和批量更新

    我正在使用 Spring Data MongoDB 并且想要执行批量更新 就像此处描述的那样 http docs mongodb org manual reference method Bulk find update Bulk find
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • Mongo C# 驱动程序更新嵌套数组中的特定元素

    如何在 Mongo C 驱动程序 中修改嵌套属性 数组 中的单个元素而不检索整个文档 public class Element public int Value get set public string Name get set publ
  • Strapi 未加载 Digital Ocean 上托管的现有 MongoDB 中的集合

    我正在使用 Strapi 创建一个新应用程序 并尝试将其与托管在 Digital Ocean 上的 MongoDB 连接 但不幸的是Strapi 无法从现有 MongoDB 获取集合 在这里 我提到我实现 Strapi 与现有 MongoD
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i

随机推荐

  • 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