training:PRIMARY> Date()
Fri Jun 08 2012 13:53:03 GMT+0100 (IST)
training:PRIMARY> new Date()
ISODate("2012-06-08T12:53:06.831Z")
training:PRIMARY> var start = new Date("21/May/2012:16:35:33 -0400") => doesn't work
training:PRIMARY> start
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
training:PRIMARY> var start = new Date("21 May 2012:16:35:33 -0400") => doesn't work
training:PRIMARY> start
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
training:PRIMARY> var start = new Date("21 May 2012 16:35:33 -0400") => works
training:PRIMARY> start
ISODate("2012-05-21T20:35:33Z")
[install_moment.js]
function get_moment(){
// shim to get UMD module to load as CommonJS
var module = {exports:{}};
/*
copy your favorite UMD module (i.e. moment.js) here
*/
return module.exports
}
//load the module generator into the stored procedures:
db.system.js.save( {
_id:"get_moment",
value: get_moment,
});
然后在命令行加载脚本,如下所示:
> mongo install_moment.js
最后,在你的下一个mongo会话中,像这样使用它:
// LOAD STORED PROCEDURES
db.loadServerScripts();
// GET THE MOMENT MODULE
var moment = get_moment();
// parse a date-time string
var a = moment("23 Feb 1997 at 3:23 pm","DD MMM YYYY [at] hh:mm a");
// reformat the string as you wish:
a.format("[The] DDD['th day of] YYYY"): //"The 54'th day of 1997"
6条答案
按热度按时间vlf7wbxs1#
使用MongoDB 4.0及更新版本
**
$toDate
运算符会将数值转换为日期,如果数值无法转换为日期,则$toDate
出错。如果数值为空或缺失,则$toDate
**返回空:您可以在聚合管道中使用它,如下所示:
上面的操作相当于使用**
$convert
**运算符,如下所示:使用MongoDB 3.6及更高版本
您还可以使用**
$dateFromString
**操作符,它将日期/时间字符串转换为日期对象,并具有指定日期格式和时区的选项:使用MongoDB版本
>= 2.6 and < 3.2
如果MongoDB版本没有原生操作符进行转换,则需要手动迭代**
find()
方法返回的cursor,使用forEach()
方法或cursor方法next()
来访问文档。使用循环,将字段转换为ISODate对象,然后使用$set
**操作符更新字段。如下例所示,该字段名为created_at
,当前以字符串格式保存日期:为了提高性能,特别是在处理大型集合时,利用**Bulk API**进行批量更新,因为您将以1000个批量向服务器发送操作,这将为您提供更好的性能,因为您不会向服务器发送每个请求,而是每1000个请求中发送一次。
下面演示了这种方法,第一个示例使用MongoDB版本
>= 2.6 and < 3.2
中可用的Bulk API。它通过将created_at
字段更改为date字段来更新集合中的所有文档:使用MongoDB 3.2
下一个示例适用于新的MongoDB版本
3.2
,该版本已经弃用了Bulk API,并使用**bulkWrite()
**提供了一组更新的API:7gs2gvoe2#
在我的例子中,我成功地使用了以下解决方案,将ClockTime集合中的字段ClockInTime从string转换为Date类型:
a6b3iqyw3#
您可以使用javascript在第二个链接提供的拉维Khakhkhar或您将不得不执行一些字符串操作转换您的原始字符串(作为一些特殊字符在您的原始格式不被识别为有效的delimeter),但一旦你这样做,你可以使用“新”
这里有一些你可能会发现有用的链接(关于修改mongo shell中的数据)-
http://cookbook.mongodb.org/patterns/date_range/
http://www.mongodb.org/display/DOCS/Dates
http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell
6rvt4ljy4#
我在MongoDB中存储了一些字符串,这些字符串必须在MongoDB中重新格式化为正确有效的dateTime字段。
下面是我的特殊日期格式代码:2014-03-12T09:14:19.5303017+01:00
但是你可以很容易地接受这个想法,编写自己的正则表达式来解析日期格式:
6tqwzwtp5#
如何通过编写这样的脚本来使用像momentjs这样的库:
然后在命令行加载脚本,如下所示:
最后,在你的下一个mongo会话中,像这样使用它:
e4eetjau6#
我发现将$toDate运算符与updateMany结合使用是最简单的。