如何在mongodb中更新数组中的值?

9nvpjoqh  于 2023-03-01  发布在  Go
关注(0)|答案(1)|浏览(175)

例如,文档。

[
  {
    "username": "joy",
    "size_info": [
      {
        "data1": "apple bear cat",
        "data2": 100
      },
      {
        "data1": "dog eat fog good ",
        "data2": 100
      },
      {
        "data1": "hug ill jump",
        "data2": 100
      }
    ]
  }
]

我想更新如下文档。
data 3是在从data 1得到2个字之后按空格分割数据。
当我使用$substr时,我得到错误can't convert from BSON type array to String

[
  {
    "username": "joy",
    "size_info": [
      {
        "data1": "apple bear cat",
        "data2": 100,
        "data3": "apple bear"
      },
      {
        "data1": "dog eat fog good ",
        "data2": 100,
        "data3": "dog eat"
      },
      {
        "data1": "hug ill jump",
        "data2": 100,
        "data3": "hug ill"
      }
    ]
  }
]

有可能吗?谢谢你的帮助。

5jvtdoz2

5jvtdoz21#

先决条件:必须使用聚合管道更新记录。

    • 溶液1:使用正则表达式**
  1. $set-设置size_info数组。
    1.1. $map-迭代size_info数组中的元素并返回一个新数组。
    1.1.1. $mergeObjects-将当前小版本文档与 * 1.1.1.1 * 的结果合并。
    1.1.1.1.一个包含data3字段的文档,使用正则表达式从结果中获取捕获前两个单词的第一个捕获元素。
db.collection.update({},
[
  {
    $set: {
      size_info: {
        $map: {
          input: "$size_info",
          in: {
            $mergeObjects: [
              "$$this",
              {
                data3: {
                  $first: {
                    $getField: {
                      field: "captures",
                      input: {
                        $regexFind: {
                          input: "$$this.data1",
                          regex: "^([^\\s]* [^\\s]*).*$"
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Demo Solution 1 @ Mongo Playground

    • 溶液2:使用$firstN**获取前N个元素

先决条件:MongoDB版本5.2

  1. $set-设置size_info阵列。
    1.1. $map-迭代size_info数组中的元素并返回一个新数组。
    1.1.1. $mergeObjects-将当前小版本文档与 * 1.1.1.1 * 的结果合并。
    1.1.1.1.一个带有data3字段的文档。修剪$reduce操作符返回的结果,该操作符将:
    a.用空格将data1拆分成一个数组,取前两个元素。
    b.将数组中的值(来自 * a * 的结果)连接成一个带空格的字符串。
db.collection.update({},
[
  {
    $set: {
      size_info: {
        $map: {
          input: "$size_info",
          in: {
            $mergeObjects: [
              "$$this",
              {
                data3: {
                  $trim: {
                    input: {
                      $reduce: {
                        input: {
                          $firstN: {
                            input: {
                              $split: [
                                "$$this.data1",
                                " "
                              ]
                            },
                            n: 2
                          }
                        },
                        initialValue: "",
                        in: {
                          $concat: [
                            "$$value",
                            " ",
                            "$$this"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
])

Demo Solution 2 @ Mongo Playground

相关问题