我通过以下查询插入文档:
db.collection.insert(
{
date: Date('Dec 12, 2014 14:12:00')
})
但是它会给我一个错误。
如何在我的集合中插入日期而不出错?
我通过以下查询插入文档:
db.collection.insert(
{
date: Date('Dec 12, 2014 14:12:00')
})
但是它会给我一个错误。
如何在我的集合中插入日期而不出错?
由于上述代码中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 LunnDate
构造函数的参数在MongoDB中的区别。感谢您的启示。 - chridamDate
与shell期望的ISODate()
执行相同的操作。 ISODate()
在表示上更加严格,仅接受会导致UTC构造的字符串。这就是区别所在。 - Neil LunnJavaScript日期对象可能有些奇怪。根据你如何实际提供参数来实例化它们,你会得到不同的结果。
例如,有人可能建议你尝试这样做:
var myDate = new Date(2014, 11, 12, 14, 12)
这看起来还不错,但存在一个问题。
你会发现,在JavaScript中有些实例化Date
对象的方式使用“本地”时区创建日期,而另一些则使用UTC或“协调世界时”等已设定的标准时区。这也是MongoDB所期望的“标准”,通常被认为在应用程序中以这种方式存储日期是最佳实践。在代码中进行任何转换,远离数据存储。这可以确保您可以处理多个语言环境而没有问题。
所以你应该这样做:
var date = new Date("2014-12-11T14:12:00Z")
var date = new ISODate("2014-12-11T14:12:00Z")
这将产生一个UTC日期值,按预期正确存储。在将日期存储到MongoDB中时,应始终处理UTC。