为集合中的所有文档更新数组中的一个或两个字段 - mongodb

Posted

技术标签:

【中文标题】为集合中的所有文档更新数组中的一个或两个字段 - mongodb【英文标题】:Update one or two fields in an array for all documents in a collection - mongo db 【发布时间】:2021-12-31 23:00:03 【问题描述】:

首先,我使用的是 Mongo DB Compass 和 mongo shell。 例如,我想更新这个字段:1List.Comment

在此字段中,我想将 'ß' 替换为 'ss'

1List 是一个数组。在这个数组中我可以有几个对象。 这些对象包含“评论”字段。

这是一个示例文档:


   "_id":
      "$oid":"12345"
   ,
   "1List":[
      
         "Comment": "TEßT Comment",
         "TEXT_VALUE":"Another test string",
         "REASON":"No Reason"
      ,
      
         "Comment": "TEßT Comment the second",
         "TEXT_VALUE":"Another second string",
         "REASON":"No Reason again"
      
   ]

这是我在 mongo db shell 中尝试过的:

db.getCollection('TEST_Collection').aggregate(
[
    $match: 
        '1List.Comment': 
            $exists: true
        
    
, 
    $unwind: 
        path: '$1List',
        includeArrayIndex: '1List.CommentArrayIndex',
        preserveNullAndEmptyArrays: false
    
, 
    $project: 
        '1List.Comment': 1
    
]
)
.forEach(function(doc,Index) doc.1List.Comment=doc.1List.Comment.replace(/[ß]/g, 'ss');
db.TEST_Collection.updateMany( "_id": doc._id , "$set":  "1List.Comment": doc.1List.Comment  );)

但我收到错误消息: 无法在元素 1List:.......

中创建字段“评论”

任何人都可以帮助更新这些评论字段吗? 我在陈述中做错了什么?

此外,是否有一种简单的解决方案可以在更新评论后立即更新“TEXT_VALUE”?

谢谢!

【问题讨论】:

【参考方案1】:

你应该替换这一行

db.TEST_Collection.updateMany( "_id": doc._id , "$set":  "1List.Comment": doc.1List.Comment  );)

db.TEST_Collection.updateMany( "_id": doc._id , "$set":  "1List.$[].Comment": doc.1List.Comment  );)

您也可以查看docs。

【讨论】:

非常感谢。这样可行!你也知道我的第二个问题吗?可以说不仅要替换 ß 字段 Comment 还要替换 text_value ?我的意思是如果我将此字段也添加到 $match 我只会得到包含两个字段的文档正确吗?但在某些情况下,其中一个也可能未填写,因此文档中也不存在。对此有何建议?谢谢!! 嗨 Ruben Vega,在测试你的新行时,我看到他现在正在覆盖字段。这意味着他将接受评论并替换 ß 但随后也会使用更新后的字符串来更新第二个对象,即使那是不同的字符串 对于第一条评论:我会为每个字段使用不同的更新,因为您已经完成了所有工作,您应该更改字段。 第二个你可以使用arrayFilters来更新你想要的。我在这里给你举个例子,在 arrayFilter 查询中你应该把doc.1List.Comment 放在没有替换的地方。 mongoplayground.net/p/_CgwE8_-eZa 太棒了!非常感谢!现在我面临另一个问题:开始我的第一次更新后,大约 50 分钟后,我收到错误消息: MongoServerError: Error on remote shard *****.com:27000 :: 由 :: cursor id 1272890412590646833 not found 引起这个错误我检查了这个字段,他没有全部更新,所以他停下来抛出了这个错误。关于这个以及如何解决的任何想法?我读过一些关于 noCursorTimeout() 的内容,但我不确定在我的声明中如何以及在何处使用它。

以上是关于为集合中的所有文档更新数组中的一个或两个字段 - mongodb的主要内容,如果未能解决你的问题,请参考以下文章

pymongo 用它的子字符串值更新字段集合中的所有文档

在 Mongo 集合中更新数组中的一条记录

使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?

将新字段添加到集合的所有文档中,将文档字段中的值添加到 MongoDB (Mongoose) 中,记录为 300K+

向 MongoDB 集合中的每个文档添加新字段

如何根据MongoDB中文档字段中的每个数组项过滤集合