【问题标题】:How to map array of object and convert string value to number in mongodb?如何映射对象数组并将字符串值转换为mongodb中的数字?
【发布时间】:2021-06-11 12:27:36
【问题描述】:

这里我有带有 details 字段作为数组的文档:

 {   
        "_id" : ObjectId("60ae0b29ab282518443c7ac5"),
        "details": [
              {
                "label": "Asset title",
                "value": "S1",
              },
              {
                "label": "Total Cost",
                "value": "250",
              },
              {
                "label": "Possession Status",
                "value": "Available",
              },
              {
                "label": "Estimated Monthly Rent",
                "value": "15.5",
              }
            ]
    },
    {   
        "_id" : ObjectId("60ae0b29ab282518443c7ac8"),
        "details": [
              {
                "label": "Asset title",
                "value": "S2",
              },
              {
                "label": "Total Cost",
                "value": "455.5",
              },
              {
                "label": "Possession Status",
                "value": "Available",
              },
              {
                "label": "Estimated Monthly Rent",
                "value": "30",
              }
            ]
    }

所以我试图通过映射对象数组来$project 这个对象数组并检查标签是“总成本”还是“估计月租”,然后我想将它们的字符串值转换为数字。例如:如果{label = "Total Cost"},则:{"$toDouble" : value},如果{label = "Estimated Monthly Rent"},则:{"$toDouble" : value}

我正在尝试,但出现错误。

 db.collection.aggregate([
       {
             "$project": {
                                   
                    "data": {
                         "$map": {
                                "input": "$details", 
                                 "as": "val", 
                                 "in": {
                                 "$cond":{ if: {"$$val.label": "Total Cost"} , then: { "$toDouble" : "$$val.value"}},
                                 "$cond":{ if: {"$$val.label": "Estimated Monthly Rent"} , then: { "$toDouble" : "$$val.value"}}
                                  }
                         }
                     } 
              }
        }
    ])

【问题讨论】:

    标签: javascript mongodb mongodb-query aggregation-framework


    【解决方案1】:

    使用$in 运算符检查条件,如果匹配则返回转换后的值,否则返回现有对象

    db.collection.aggregate([
      {
        "$project": {
          "data": {
            "$map": {
              "input": "$details",
              "as": "val",
              "in": {
                $cond: [
                  { $in: ["$$val.label", ["Total Cost", "Estimated Monthly Rent"]] },
                  {
                    label: "$$val.label",
                    value: { $toDouble: "$$val.value" }
                  },
                  "$$val"
                ]
              }
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

      【解决方案2】:

      您的查询的问题是您在in 字段中使用了两个$cond 键,仅使用一个并使用$or 运算符。另一件事是在聚合管道中使用$eq 进行相等匹配,最后不要错过$cond 中的else 子句。

      此查询有效:

      db.collection.aggregate([
        {
          "$project": {
            "data": {
              "$map": {
                "input": "$details",
                "as": "val",
                "in": {
                  "$cond": {
                    if: {
                      $or: [
                        {
                          "$eq": [
                            "$$val.label",
                            "Total Cost"
                          ]
                        },
                        {
                          "$eq": [
                            "$$val.label",
                            "Estimated Monthly Rent"
                          ]
                        }
                      ]
                    },
                    then: {
                      "$toDouble": "$$val.value"
                    },
                    else: {
                      "$toString": "$$val.value"
                    }
                  }
                }
              }
            }
          }
        }
      ])
      

      检查它是否工作here

      【讨论】:

      • 在输出中它只给出值结果,我想要 details 数组的结构,只转换 Total Cost 和 Estimated Monthly Rent 的值。我也是这方面的初学者,所以我在这里有点困惑。
      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2019-03-10
      • 2016-03-09
      • 2012-04-30
      • 2013-05-06
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多