将 MongoDB 字段从字符串转换为数组中的 ISODate

Posted

技术标签:

【中文标题】将 MongoDB 字段从字符串转换为数组中的 ISODate【英文标题】:Convert MongoDB field from String to ISODate in array 【发布时间】:2019-08-08 07:38:02 【问题描述】:

我需要在 MongoDB 中将存储数组值的 typeString 更改为 ISODate。该过程应该更改存储的类型,不仅仅是以新格式将它们投影出来

文档结构如下,目标值嵌套在absences[].date的数组中。

[
    "id": 3086,
    "first": "Knox",
    "last": "Keith",
    "middle": "Kent",
    "absences": [
            "date": "Wed Nov 28 2018 15:12:09 GMT+0000 (UTC)",
            "code": "X",
            "type": "E",
            "isPartial": false
        ,
        
            "date": "Wed Dec 26 2018 12:35:46 GMT+0000 (UTC)",
            "code": "X",
            "type": "E",
            "isPartial": false
        
    ]
]

我可以使用$set 轻松更改这些字段的值(但不能更改类型):

db.students.update(
    ,
    $set:  "absences.$[].date" : "changed"  ,
    multi: true 
)

@JohnnyHK 分享了这个将字符串更改为 ISODate 的示例,但这仅适用于***对象(不适用于数组)。

db.snippets.find(created_at: $not: $type: 9).forEach(function(doc) 
    doc.created_at = new Date(doc.created_at);
    db.snippets.save(doc);
)

我将不胜感激有关结合这两种策略的建议,即循环通过absences 数组将date 字段从String 转换为ISODate

【问题讨论】:

【参考方案1】:

这可以使用下面的聚合管道来实现。

db.students.aggregate([
    
        '$addFields': 
            'absences': 
                '$map': 
                    'input': '$absences', 
                    'as': 'absence', 
                    'in': 
                        'date': 
                            '$toDate': 
                                '$substr': [
                                    '$$absence.date', 0, 
                                        '$subtract': [
                                            
                                                '$strLenCP': '$$absence.date'
                                            , 5
                                        ]
                                    
                                ]
                            
                        , 
                        'code': '$$absence.code', 
                        'type': '$$absence.type', 
                        'isPartial': '$$absence.isPartial'
                    
                
            
        
    , 
        '$out': 'students'
    
])

【讨论】:

据我了解,$addFields 仅以不同的格式投影数据。它不会改变底层的BSON value type。 检查最后的$out 阶段。 $out 阶段,获取聚合管道返回的文档并将它们写入指定的集合。如果 $out 操作指定的集合已经存在,那么在聚合完成后,$out 阶段会自动将现有集合替换为新的结果集合。 docs.mongodb.com/manual/reference/operator/aggregation/out 我已经修复了日期转换问题,查询应该对你有用。 感谢您提供此解决方案,并让我了解 $out。 虽然日期字段现在采用 ISODate() 格式,但 UTC 偏移量存在可变变化。注意下面的两个字段有一个 -0700 偏移量和一个 -0800 偏移量。您对为什么会发生这种情况有任何想法吗? “日期”:ISODate(“2019-01-28T16:18:42.000-08:00”),“代码”:“X”,“类型”:“E”,“isPartial”:假,“日期" : ISODate("2019-03-14T08:25:53.000-07:00"), "code" : "U", "type" : "U", "isPartial" : false

以上是关于将 MongoDB 字段从字符串转换为数组中的 ISODate的主要内容,如果未能解决你的问题,请参考以下文章

MongoDb:将模型字段从字符串数组修改为引用另一个模型的 id 数组的最佳方法是啥?

MongoDB如何将数组中的字段类型从字符串更改为数组并保持原始值

将对象数组转换为mongodb中的字符串数组

将字符串字段转换为 MongoDB 中的编码字符串

需要将字节数组/二进制消息从 UDP DatagramPacket 转换为 java 中的几个字段

将 MongoDB 查询转换为雪花