如何在MongoDB中替换子字符串

时间:2019-06-13 23:18:04

标签: mongodb

我在表单的集合中有很多mongodb文档:

{
    "_id" : ObjectId("5d02d179a2d0dead77a4c9c5"),
    "distributed" : false,
    "winner" : false,
    "number" : "855254",
    "dateCreated" : "13-06-2019 19:43:05",
    "date" : ""
}

/* 2 */
{
    "_id" : ObjectId("5d02d179a2d0dead77a4c9c7"),
    "distributed" : false,
    "winner" : false,
    "number" : "263141",
    "dateCreated" : "13-06-2019 19:43:05",
    "date" : ""
}

我想将"number"字段中的所有数据替换为:

{
    "_id" : ObjectId("5d02d179a2d0dead77a4c9c5"),
    "distributed" : false,
    "winner" : false,
    "number" : "8-55254",
    "dateCreated" : "13-06-2019 19:43:05",
    "date" : ""
}

/* 2 */
{
    "_id" : ObjectId("5d02d179a2d0dead77a4c9c7"),
    "distributed" : false,
    "winner" : false,
    "number" : "2-63141",
    "dateCreated" : "13-06-2019 19:43:05",
    "date" : ""
}

我已经尝试过某些方法,但是没有成功。

1 个答案:

答案 0 :(得分:1)

Mongo 4.2开始(仍处于预发行版本),您可以利用db.collection.update()现在接受聚合管道的事实,该聚合管道允许根据其当前值更新字段:

// { number: "855254" }
db.collection.update(
  {},
  [{ $set: {
    number: { $concat: [
      { $substr: [ "$number", 0, 1 ] },
      "-",
      { $substr: [ "$number", 1, -1 ] }
    ]}
  }}],
  { multi: true }
)
// { number: "8-55254" }
  • 第一部分{}是匹配查询,用于过滤要更新的文档(在本例中为所有文档)。为了安全起见,您可以过滤number值大小大于1的文档。

  • 第二部分[{ $set: { number: { $concat: [ ... }]是更新聚合管道:

    • 请注意表示使用聚合管道的方括号。
    • $set$addFields的别名)是一个新的聚合运算符,在这种情况下,它将替换该字段的值。
    • $substr使用了两次:一次获取第一个字符,另一次获取字符串的尾部(使用-1作为$substr的第三个参数意味着获取剩余的字符串)。
    • 然后$concat"-"将这两部分结合起来。
  • 不要忘记{ multi: true },否则只会更新第一个匹配的文档。