【问题标题】:MongoDB aggregate for simple array spesific value replace and convert用于简单数组特定值替换和转换的 MongoDB 聚合
【发布时间】:2021-07-12 19:08:07
【问题描述】:

关于数组修改的 Mongodb 聚合我被困在某个地方。

我的数组如下所示:

[
  {
    location: {
      open: true,
      expected: [
        "foo",
        "bar",
        "baz"
      ]
    }
  }
]

我想查找并替换特定值并转换为ObjectId

我尝试过使用这个管道:

[
    {
        $match: {
            "location.expected": {$eq: "foo"}
        },
    }
    {
        $set: {
            "location.expected": {
                $map: {
                    input: "$location.expected",
                    as: "loc",
                    in: {
                        $replaceAll: {
                            input: "$$loc",
                            find: "foo",
                            replacement: "60783e804136605b0a48bfe8"
                        }
                    }
                }
            }
        }
    }
]

现在可以了。但我无法转换为 ObjectId,替换值。

所以,我是关于查找、替换和转换特定简单数组值的简单解决方案。

谢谢大家。

【问题讨论】:

    标签: arrays mongodb aggregation-framework aggregate


    【解决方案1】:

    您只想将字符串转换为 ObjectId,如下所示:

    db.collection.aggregate([
      {
        $match: {
          "location.expected": "foo"
        }
      },
      {
        $set: {
          "location.expected": {
            $map: {
              input: "$location.expected",
              as: "loc",
              in: {
                $cond: [
                  {
                    $eq: [
                      "$$loc",
                      "foo"
                    ]
                  },
                  ObjectId("60783e804136605b0a48bfe8"),
                  "$$loc"
                ]
              }
            }
          }
        }
      }
    ])
    

    如您所见,我稍微更改了您的管道,我个人不建议在此用例中使用 $replaceAll,因为它是一个更昂贵的操作,并且适合用作正则表达式而不是精确匹配运算符.

    Mongo Playground

    【讨论】:

    • 谢谢@tom。我会将此应用于 4000 条记录,所以如果您有建议我可以申请。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2021-11-25
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多