MONGODB-对象数组中每个对象的转换类型

时间:2018-07-17 11:28:05

标签: mongodb

我有MongoDB Collection,其中一些文档包含对象数组。此对象的字段之一是timestamp

问题是,从历史上看,timestamp中的某些值是字符串(例如'2018-02-25T13:33:56.675000')或日期,而其中一些是双精度(例如1528108521726.26)。

我必须将它们全部转换为Double。

我已经建立了查询来获取所有类型有问题的文档:

db.getCollection('Cases').find({sent_messages: {$elemMatch:{timestamp: {$type:[2, 9]}}}})

而且我也知道如何使用JS将Date-string转换为double:

new Date("2018-02-18T06:39:20.797Z").getTime()
> 1518935960797

但是我无法建立适当的查询来执行更新。

以下是此类文档的示例:

{
    "_id" : ObjectId("6c88f656532aab00050dc023"),
    "created_at" : ISODate("2018-05-18T03:43:18.986Z"),
    "updated_at" : ISODate("2018-05-18T06:39:20.798Z"),
    "sent_messages" : [ 
        {
            "timestamp" : ISODate("2018-02-18T06:39:20.797Z"),
            "text" : "Hey",
            "sender" : "me"
        }
    ],
    "status" : 1
}

更新后应该是:

{
    "_id" : ObjectId("6c88f656532aab00050dc023"),
    "created_at" : ISODate("2018-05-18T03:43:18.986Z"),
    "updated_at" : ISODate("2018-05-18T06:39:20.798Z"),
    "sent_messages" : [ 
        {
            "timestamp" : 1518935960797.00,
            "text" : "Hey",
            "sender" : "me"
        }
    ],
    "status" : 1
}

2 个答案:

答案 0 :(得分:0)

根据您的问题,您正在尝试首先获取记录。

db.getCollection('Cases').find({sent_messages: {$elemMatch:{timestamp: {$type:[2, 9]}}}})

然后在JS中转换日期:

new Date("2018-02-18T06:39:20.797Z").getTime()

然后这是一个更新查询:

db.getCollection('Cases').updateOne({_id:ObjectId("6c88f656532aab00050dc023")}, { $set: { "sent_messages.$.timestamp" : "218392712937.0" }})

如果要更新所有记录,则应编写一些forEach机制。我想您已经实现了。

希望这对您有所帮助。

答案 1 :(得分:0)

最后,我只是使用可在mongo控制台中运行的JS代码来做到这一点:

db.getCollection('Cases').find({sent_messages: {$elemMatch:{timestamp: {$type:[2, 9]}}}}).forEach(function(doc) {
  print('=================');
  print(JSON.stringify(doc));
  doc.sent_messages.forEach(function(msg){
    var dbl = new Date(msg.timestamp).getTime();
    print(dbl);
    msg.timestamp = dbl;
      });
   print(JSON.stringify(doc))
   db.Cases.save(doc);
} )

感谢您的帮助!