【问题标题】:Given an array of matches, find all documents that have atleast one match and replace all matches with given value给定一个匹配数组,找到至少有一个匹配的所有文档,并将所有匹配替换为给定值
【发布时间】:2021-06-08 04:36:24
【问题描述】:

我是 mongodb 的新手,我正在尝试(如标题所述)“给定一组匹配项,查找所有具有至少一个匹配项的文档并用给定值替换所有匹配项”

例如,假设我的 mongodb 中有这些文档:

[
  {
    "_id": ObjectId("5e90880a39cfeaaf0b97b576"),
    "StudentName": [
      "Chris, C",
      "David, O",
      "Mike, K",
      "Sam, Bard"
    ]
  },
  {
    "_id": ObjectId("5e90880a39cfeaaf0b97b577"),
    "StudentName": [
      "Joe, J",
      "John, K",
      "David, O",
      "Sam, Ba rd",
      "Sam, B"
    ]
  }
]

我想查找所有包含 ["Sam, B", "Sam, Bard", "Sam, Ba rd"] 的文档并替换为 "Sam"

预期结果:

[
  {
    "_id": ObjectId("5e90880a39cfeaaf0b97b576"),
    "StudentName": [
      "Chris, C",
      "David, O",
      "Mike, K",
      "Sam"
    ]
  },
  {
    "_id": ObjectId("5e90880a39cfeaaf0b97b577"),
    "StudentName": [
      "Joe, J",
      "John, K",
      "David, O",
      "Sam",
      "Sam"
    ]
  }
]

我想做什么:

db.collection.updateMany({ "StudentName":  {"$in":["Sam, B", "Sam, Bard", "Sam, Ba rd"]} },{ "$set": { "StudentName.$": "Sam" } })

这没有用。有什么帮助吗?非常感谢。

EDIT1:我需要它是动态的,我将通过 NodeJS 应用程序提供可能匹配的数组和要替换的字符串。

EDIT2:举一个 EDIT1 的例子,我可以传递一个像这样的数组 ["John,"Bob","Jessica","Robert"] 来替换为 "Josh"

【问题讨论】:

    标签: javascript mongodb aggregate


    【解决方案1】:

    有几种方法可以做到这一点。从外观上看,您希望通过一个可以直接在 shell 中运行的命令来完成。

    您可以利用updateMany 中的arrayFilters 选项执行此操作。请参阅https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/#std-label-updateMany-arrayFilters 了解更多相关文档。

    为简单起见,我不会利用索引,因此以下命令将遍历集合中的所有文档。如果您想利用索引,您只需调整 updateMany 的查询部分

    db.collection.updateMany(
       { },
       { $set: { "StudentName.$[element]" : "Sam" } },
       { arrayFilters: [ { "element":  /.*Sam.*/i } ] }
    )
    

    以上内容会将包含“Sam”的任何值替换为值“Sam”。所以“Sam I Am”将被替换为“Sam”。

    如果您知道要替换的值:

    db.students.updateMany(
       { },
       { $set: { "StudentName.$[element]" : "Ana" } },
       { arrayFilters: [ {  "element": { $in:  ["John", "Jessica", "Robert", "Rob"] } } ] }
    )
    

    这会将 John、Jessica、Robert 和 Rob 的所有值替换为“Ana”。

    【讨论】:

    • 感谢您的回答,但我需要它是动态的,抱歉,如果我之前没有指定。所以这可以为任何 StudentName 完成。例如,我可以尝试查找 ["Rob", "Rob, C", "Robert"] 并替换为 "Carl"。我正在通过一个 NodeJS 后端来完成它,该后端将提供要查找的东西数组(上面的 Rob 数组)和要替换的字符串(在示例中为“Carl”)
    • @jay2p 您只需将 /.*Sam.*/i 替换为 /.*Rob.*/i,然后将“Sam”替换为“Carl”。因此,只需创建中间变量来存储可能更改的相应值,然后在您的应用程序中根据需要更改这些值。
    • 我明白了,谢谢您的回复,但在我的情况下,我认为正则表达式不会起作用,因为在匹配数组中可以是任何东西,例如 ["John", "Jessica", “罗伯特”,“罗伯”]并替换为“安娜”。我可以为数组中的每个调用一次 updateMany 查询,但如果可能的话,id 就像一种只调用一次的方法。我需要数组内的字符串完全匹配。
    • 我不太了解需要这样做的用例。 @jay2p。您可以将 $in 运算符与 arrayFilters 一起使用,但随后您需要拥有要替换的确切值。我将在上面进行编辑以显示该示例。否则,您可能必须在多个步骤中或在每个文档的 forEach 循环中执行此操作。
    • 这正是我所需要的!非常感谢你,你在做上帝的工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2016-12-02
    • 2017-03-15
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多