通过mongo shell将Date()插入到Mongodb中

16

我通过以下查询插入文档:

db.collection.insert(  
{  
      date: Date('Dec 12, 2014 14:12:00')  
})  

但是它会给我一个错误。

如何在我的集合中插入日期而不出错?


3
什么错误?请编辑你的问题并添加错误信息。 - user1907906
2
这个问题明确说明是在shell中,所有给出的答案都是针对javascript的。请提供一个在mongo控制台中插入的答案。 - Peter Kaminski
2个回答

19

由于上述代码中Date()方法返回当前日期的字符串形式,而不考虑传递给该对象的任何参数,因此您可能会收到不同的错误。根据文档的说明: 只能通过调用JavaScript Date作为构造函数来实例化JavaScript Date对象:调用它作为普通函数(即没有使用new运算符)将返回一个字符串,而不是Date对象;与其他JavaScript对象类型不同,JavaScript日期对象没有文字语法。

您可能希望尝试这个方法以获取正确的日期,需要注意JavaScript的Date构造函数的月份参数是基于0的:

var myDate = new Date(2014, 11, 12, 14, 12);
db.collection.insert({ "date": myDate });

不错的参考资料,但是对于 Date 构造器的工作方式和 MongoDB 的要求并不十分“真正”明确。 - Neil Lunn
感谢您的纠正,我最初认为从MongoDB shell documentation中可以看出Date()方法返回当前日期作为字符串,就像上面所述的那样,以及Date对象的结果在大约290万年的过去和未来内形成可表示的日期范围,但我从未真正理解Date构造函数的参数在MongoDB中的区别。感谢您的启示。 - chridam
JavaScript中的Date与shell期望的ISODate()执行相同的操作。 ISODate()在表示上更加严格,接受会导致UTC构造的字符串。这就是区别所在。 - Neil Lunn

16

JavaScript日期对象可能有些奇怪。根据你如何实际提供参数来实例化它们,你会得到不同的结果。

例如,有人可能建议你尝试这样做:

var myDate = new Date(2014, 11, 12, 14, 12)

这看起来还不错,但存在一个问题。

你会发现,在JavaScript中有些实例化Date对象的方式使用“本地”时区创建日期,而另一些则使用UTC或“协调世界时”等已设定的标准时区。这也是MongoDB所期望的“标准”,通常被认为在应用程序中以这种方式存储日期是最佳实践。在代码中进行任何转换,远离数据存储。这可以确保您可以处理多个语言环境而没有问题。

所以你应该这样做:

var date = new Date("2014-12-11T14:12:00Z")

在MongoDB的shell中还有一个“helper”几乎以相同的方式处理这个问题,但更加特定于语法。
var date = new ISODate("2014-12-11T14:12:00Z")

这将产生一个UTC日期值,按预期正确存储。在将日期存储到MongoDB中时,应始终处理UTC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接