从 MongoDB 集合中所有文档的其他字段中的值创建多个新字段

时间:2021-03-17 17:23:49

标签: mongodb mongo-shell

我在集合中的 mongoDB 文档上有几个数据问题。我正在尝试编写一个 db.collection.updateAll 脚本来更新文档,但无论我做什么,我似乎都无法让它工作。

我想将 data.date 中存储的文本字符串从字符串转换:

“数据”:{ “日期”:“2019-01-07T00:00:00.000Z” }

进入 ISO 日期。

我想获取 _id 字段,并将其复制到名为“id”的字段中,我知道这可能看起来很傻,但是我们的某些报告中存在错误,我无法在其中获得代码更新几周,因此通过“id”和“_id”字段提供数据将停止服务台呼叫,直到我得到适当的修复。

我一直在尝试这个:

db.getCollection("myCollection").updateMany({}, 
    [{
       "$set": {
           { "id" : ["$_id"] } ,
                   "$data.date": {
                     "$dateFromString": {
                        dateString: '$data.date'
                     }
           }
       }
    }]
);

但是两个字段都没有设置。当我单独运行这两个 $sets 时,我收到以下错误消息...

当我尝试设置“id”时:

db.getCollection("myCollection").updateMany(
      {},
      { $set: { "id" : ["$_id"] } }
   );

它只是将值设置为“$_id”,而不是从 _id 字段中获取值。

如果我尝试设置日期字段

db.getCollection("myCollection").updateMany(
      {},
      { $set: {  "$data.date": {
                     "$dateFromString": {
                        dateString: '$data.date'
                     }
           } } }
   );

我收到错误消息:

'$data' 中以美元 ($) 为前缀的字段 '$data' 对存储无效。

我可以在网上找到的所有示例都展示了如何设置文字值,但似乎没有一个有助于从字段本身获取新值。

1 个答案:

答案 0 :(得分:0)

在这里试试这个它应该可以工作,因为您正在尝试添加新字段,因此请使用 $addFields。适用于 mongoDb 4.2

db.test.updateMany({}, 
   [  {
        $addFields:{
           id:'$_id',
           'data.date':{$toDate:'$data.date'}
        }
      }
   ]
)
相关问题