【问题标题】:Convert $objectToArray map element to String将 $objectToArray 映射元素转换为字符串
【发布时间】:2022-02-10 18:23:54
【问题描述】:

我在数据库中有一个集合,我试图从中检索一些数据,当$orderID 有字符串元素时查询工作正常,但是当 $orderID 在数组中有一些数字时查询失败,并且它正在抛出

query failed: (Location40395) PlanExecutor error during aggregation :: caused by :: $arrayToObject requires an array of key-value pairs, where the key must be of type string. Found key type: double

我认为当我们将 orderID 保存为数字时一定有一些旧数据,这就是为什么它在某些日期范围内失败

查询

{
    "Order_Details": {
        "$map": {
            "input": {
                "$objectToArray": {
                    "$arrayToObject": {
                        "$zip": {
                            "inputs": [
                                "$orderID",
                                "$total_value_of_order"
                            ]
                        }
                    }
                }
            },
            "as": "el",
            "in": {
                "orderID": "$$el.k",
                "total_value_of_order": "$$el.v"
            }
        }
    }
}

我正在尝试将 el.k 类型转换为我正在使用的字符串 $toString 但似乎无法正常工作,我尝试的方式是

{
    "as": "el",
    "in": {
        "orderID": {
            "$toString": "$$el.k"
        },
        "total_value_of_order": "$$el.v"
    }
}

示例集合

[
  {
    "_id": ObjectId("5e529ee5f8647eb59e5620a2"),
    "visitID": "dVmy7flXFHzzkn9HiMt8IoWvthoTZW",
    "date": ISODate("2022-02-08T16:29:13.413Z"),
    "control": true,
    "orderID": [
      122343242
    ],
    "target": "test",
    "total_value_of_order": [
      60
    ]
  }
]

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    你很接近,方法很好。你只有几个语法问题。 需要更改的主要内容是$arrayToObject 的输入,目前您的输入如下所示:

    [[number, number], [number, number]]
    

    但是$arrayToObject 需要以某种格式输入:

    [{k: string, v: value}]
    

    这就是我们要添加的内容,如下所示:

    db.collection.aggregate([
      {
        $project: {
          "Order_Details": {
            "$map": {
              "input": {
                "$objectToArray": {
                  "$arrayToObject": {
                    $map: {
                      input: {
                        "$zip": {
                          "inputs": [
                            "$orderID",
                            "$total_value_of_order"
                          ]
                        }
                      },
                      in: {
                        k: {
                          $toString: {
                            "$arrayElemAt": [
                              "$$this",
                              0
                            ]
                          }
                        },
                        v: {
                          "$arrayElemAt": [
                            "$$this",
                            1
                          ]
                        }
                      }
                    }
                  }
                }
              },
              "as": "el",
              "in": {
                "orderID": "$$el.v",
                "total_value_of_order": "$$el.k"
              }
            }
          }
        }
      }
    ])
    

    Mongo Playground

    注意“orderid”格式更改为string,这会影响其结构,我建议在管道中切换kv,例如this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2021-12-25
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多