我有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
}
答案 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);
} )
感谢您的帮助!