Mongodb 如何将字符串解析为日期类型;1998/10/01&引用;1998/1/01“;格式YYYY/M/D

Mongodb 如何将字符串解析为日期类型;1998/10/01&引用;1998/1/01“;格式YYYY/M/D,mongodb,Mongodb,如何将字符串解析为日期类型“1998/10/01”、“1998/1/01”格式YYYY/M/D 棘手的部分是在月份,这个字段可能是2位10~12或1位1~9 可以解析mongo中的日期字符串吗 像Date(“$Date\u str”)是的,使用Javascript 假设我有以下文档 { "_id" : ObjectId("553a6abb3614af9afd23310c"), "foo" : "bar", "date" : "1998/10/01" } 请注意,date

如何将字符串解析为日期类型“1998/10/01”、“1998/1/01”格式YYYY/M/D

棘手的部分是在月份,这个字段可能是2位10~12或1位1~9

可以解析mongo中的日期字符串吗

Date(“$Date\u str”)
是的,使用Javascript

假设我有以下文档

{
    "_id" : ObjectId("553a6abb3614af9afd23310c"),
    "foo" : "bar",
    "date" : "1998/10/01"
}
请注意,
date
是一个字符串。我们可以在MongoShell中运行以下JavaScript,将其更新为日期对象

db.test.find().forEach( function(doc) {
   if( typeof doc.date != 'undefined' ) { //There is a date property 
       var doc_date = doc.date.split("/"); //Explode on the `/`
       doc.date = new Date(doc_date[0], doc_date[1], doc_date[2]); //Overwrite current value with Date Object
       db.test.save(doc); //Save this document
   }
});
我们的文档现在将具有
Date
对象

{
    "_id" : ObjectId("553a6abb3614af9afd23310c"),
    "foo" : "bar",
    "date" : ISODate("1998-11-01T00:00:00.000Z")
}

从这样的日期字符串格式获取日期对象非常容易
YYYY/M/D
;创建时只需将字符串作为参数传递给Date对象。这两个简单的测试证实了这一点:

var d1 = new Date("1998/10/01"),
    d2 = new Date("1998/1/01");

console.log(d1); // Thu Oct 01 1998 00:00:00 GMT+0100 (GMT Daylight Time)
console.log(d2); // Thu Jan 01 1998 00:00:00 GMT+0000 (GMT Standard Time)
对于相对较小的数据集,您可以使用mongo的游标方法对运算符执行原子更新:

db.collection.find().forEach(function(doc) {
    db.collection.update(
        {"_id": doc._id}, 
        { 
            "$set": {
                "date": new Date(doc.date) 
             } 
        }
    );
});

谢谢你的回答

我们应该在月日减去1,以获得正确的日期

db[collection].find().forEach( function(doc) {
   if( typeof doc._id != 'undefined' ) { //There is a date property 
       var doc_date = doc._id.split("/"); //Explode on the `/`
       doc.date = new Date(doc_date[0], doc_date[1]-1, doc_date[2]); //Overwrite current value with Date Object
       doc.date = new Date(doc._id); //Overwrite current value with Date Object
       db[collection].save(doc); //Save this document
   }
});

此解析的目的是什么,是否要将字段数据类型从字符串转换为日期?是的,我需要将字符串类型转换为日期类型不确定是否
forEach
lazy加载数据。否则,对于非常大的结果集可能会有问题。我相信游标使用延迟加载-将搜索在使用数组元素作为日期对象参数之前,您需要执行
parseInt(doc_date[I])
。一个简单得多的方法就是创建日期对象,使用日期字符串作为参数,例如
vard1=newdate(“1998/10/01”);控制台日志(d1);//显示1998年10月1日星期四00:00:00 GMT+0100(GMT夏令时)
var d2=新日期(“1998/1/01”);console.log(d2);//显示1998年1月1日星期四00:00:00 GMT+0000(GMT标准时间)