首页 > 解决方案 > updateMany(更改数据类型)用于数组中的重复嵌套字段

问题描述

这与我最近提出的一个问题有关,即更改 MongoDB 集合中字段的格式(请参阅此处)。

我现在想做同样的操作——即将以嵌套方式出现的 n 个字段的格式从字符串更改为日期时间。下面是一个例子:

   {'_id': ObjectId('1234566'),
     'id': '1234567',
     'title': 'title',
     'nickname': '',
     'href': 'https://bla.blub',
     'response_count': 114,
     'date_created': datetime.datetime(2020, 9, 18, 9, 16),
     'date_modified': datetime.datetime(2020, 10, 4, 16, 42),
     'language': 'en',
     'question_count': 10, 
     'responses': 
     [{'id': '1234567',
   'recipient_id': '',
   'collection_mode': 'default',
   'response_status': 'completed',
   'custom_value': '',
   'first_name': '',
   'last_name': '',
   'email_address': '',
   'ip_address': '192.168.0.1',
   'logic_path': {},
   'metadata': {'contact': {}},
   'page_path': [],
   'collector_id': '123456',
   'survey_id': '123456',
   'custom_variables': {'memref': '1234567'},
   'total_time': 74,
   'date_modified': '2020-09-19T10:02:33+00:00',
   'date_created': '2020-09-19T10:01:19+00:00']} 

在我的集合中,集合中有大约 30 个文档(每个文档都有一个_id字段和与上面相同的字段,并且在每个文档中,我想将responses.$[array].date_modifiedresponses.$[array].date_created字段格式化为ISODate(Mongo shell)或`datetime(PyMongo)。

这是我目前正在使用的代码:

db.collection.update_many(
    { [
            { "responses.$[elem].date_created": { "$type": "string" } }
    ]
    },
    [
        {
        "$set": {
            "responses.$[elem].date_created": {
                "$dateFromString": {
                    "dateString": "$responses.$[elem].date_created"
                }
            }
        }
    }
    ]    
)

但这会产生以下错误(在 Pymongo 中):

WriteError: Invalid $set :: caused by :: FieldPath field names may not start with '$'., full error: {'index': 0, 'code': 16410, 'errmsg': "Invalid $set :: caused by :: FieldPath field names may not start with '$'."}

我还查阅了 MongoDB 手册中的这个条目,并尝试updateMany相应地格式化我的声明,但在 MongoDB 方面我仍然有点菜鸟,所以我非常感谢一些帮助和/或解释为什么我的代码不起作用。提前谢谢了!

标签: mongodbpymongo

解决方案


推荐阅读