我在MongoDB中有以下 struct :

{
  "system_id": 133657,
  "type": "personal",
  "prices": {
    "7": {
      "min": 0.05,
      "max": 0.05,
      "avg": 0.05,
      "sales": 1
    },
    "14": {
      "min": 0.05,
      "max": 0.05,
      "avg": 0.05,
      "sales": 3
    },
    "30": {
      "min": 0.03,
      "max": 0.04,
      "avg": 0.03,
      "sales": 8
    }
  },
  "prices_updated_at": { "$date": "2022-05-25T04:48:43.469Z" }
}

是否可以将所有价格值(最小值、最大值、平均值)迭代并乘以示例2,并以相同的 struct 输出?键(1、7、14)不是固定的,可以有不同的值,具体取决于销售统计数据.

我发现的只是数组,而不是对象相关的.

谢谢你的帮助!

推荐答案

您可以使用以下技巧:

 db.collection.aggregate([
 {
  "$addFields": {
  "prices": {
    "$objectToArray": "$prices"
   }
  }
 },
 {
 "$addFields": {
  "prices": {
    $map: {
      input: "$prices",
      as: "p",
      in: {
        "k": "$$p.k",
        "v": {
          "min": {
            $multiply: [
              "$$p.v.min",
              2
            ]
          },
          "max": {
            $multiply: [
              "$$p.v.max",
              2
            ]
          },
          "avg": {
            $multiply: [
              "$$p.v.avg",
              2
            ]
          },
          "sales": "$$p.v.sales"
         }
        }
      }
    }
   }
  },
  {
   "$addFields": {
  "prices": {
    "$arrayToObject": "$prices"
   }
  }
 }
])

说明:

  1. 将prices对象转换为array
  2. 现在使用$map将所有最小值、最大值和平均值乘以2
  3. 从数组转换回对象(返回到原始 struct )

Playground

同样的事情也可以在单个$addFields操作中完成,预计它的性能会更好,但不是很人性化:

Playground2

Mongodb相关问答推荐

在MondoDB中:将对象数组从切片索引数组切片,并通过聚合推入数组

在对象mongodb的数组中查找元素

MongoDB 聚合 groupBy 日期并计算子文档

MongoDB聚合:如何将查找结果放入嵌套数组中?

在运算符 $map 中嵌入运算符 $exists

使用名为 Object 键的 uuid 创建 mongodb 文档

为什么一个 mongodb 副本集需要奇数个投票 node ?

从 node.js 的 mongodb 集合中删除文档

Mongo C#忽略属性

如何在 Mongoose 中定义一个通用的嵌套对象

Spring Boot MongoDB 连接问题

你如何在 Kubernetes 上设置 Mongo 副本集?

有没有办法为 mongoose.js 聚合提供 allowDiskUse 选项?

Node + Mongoose:获取最后插入的 ID?

如何使用 MongoDB 以编程方式预拆分基于 GUID 的分片键

使用 Java 驱动程序更新 MongoDB 中的数组

用于嵌入式集合的 MongoDB 首选模式.文档与数组

Mongo: query by key one level deep

查询 Mongoid/rails 3 中的嵌入对象(Lower than、Min 运算符和排序)

我需要手动关闭mongoose连接吗?