MongoDB 乘以对象值?

MongoDB multiply object values?

我在 MongoDB 中有以下结构:

{
  "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 并以相同的结构输出?键 (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. 将价格对象转换为数组
  2. 现在使用 $map 将所有最小值、最大值和平均值乘以 2
  3. 从数组转换回对象(返回原始结构)

Playground

同样的事情可以在单个 $addFields 操作中完成,预计性能会更好,但人类可读性不高:

Playground2