MongoDB——ISODate日期类型

本文详细介绍了在MongoDB中使用mongoshell插入日期类型数据时,newDate()与Date()的区别,解释了ISODate类型及其如何自动转换为本地时区,并展示了如何在Python中读取这些日期类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/yuechaotian/archive/2013/02/02/2889824.html

当通过mongo shell来插入日期类型数据时,使用new Date()和使用Date()是不一样的:

> db.tianyc04.insert({mark:1, mark_time:new Date()})
> db.tianyc04.insert({mark:2, mark_time:Date()})
> db.tianyc04.find()

{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }
{ "_id" : ObjectId("5126e00c39899c4cf3805f9c"), "mark" : 2, "mark_time" : "Fri Feb 22 2013 11:03:40 GMT+0800" }

>

我们看:使用new Date(),插入的是一个isodate类型;而使用Date()插入的是一个字符串类型。

那isodate是什么日期类型的?我们看这2个值,它比字符串大概少了8小时。这是由于mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而我当前所处的是+8区,所以mongo shell会将当前的GMT+0800时间减去8,存储成GMT时间。

如果通过get函数来获取,那么mongo会自动转换成当前时区的时间:

> db.tianyc04.findOne({mark:1})
{
"_id" : ObjectId("5126e00939899c4cf3805f9b"),
"mark" : 1,
"mark_time" : ISODate("2013-02-22T03:03:37.312Z")
}
> db.tianyc04.findOne({mark:1}).mark_time
ISODate("2013-02-22T03:03:37.312Z")
> x=db.tianyc04.findOne({mark:1}).mark_time
ISODate("2013-02-22T03:03:37.312Z")
> x
ISODate("2013-02-22T03:03:37.312Z")
> x.getFullYear()
2013
> x.getMonth() # js中的月份是从0开始的(0-11)
1
> x.getMonth()+1
2
> x.getDate()
22
> x.getHours() #注意这里获取到的小时是11,而不是3
11
> x.getMinutes()
3
> x.getSeconds()
37

ISO的日期类型可以直接使用new Date来进行比较,直接使用+8后的时间即可(注意字符串使用“/”分隔符):

> db.tianyc04.find({mark_time:{$gt: new Date('2013/02/22 11:03:37')}})
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }
> db.tianyc04.find({mark_time:{$lt: new Date('2013/02/22 11:03:37')}})
> db.tianyc04.find({mark_time:{$lt: new Date('2013/02/22 11:03:38')}})
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }
> db.tianyc04.find({mark_time:{$gt: new Date('2013/02/22 11:03:37'), $lt: new Date('2013/02/22 11:03:38')}})
{ "_id" : ObjectId("5126e00939899c4cf3805f9b"), "mark" : 1, "mark_time" : ISODate("2013-02-22T03:03:37.312Z") }

那么,如果使用python来读取isodate类型的数据,会自动转化为GMT+0800时间吗?我继续测试:

> exit
bye

C:\>python
'import site' failed; use -v for traceback
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Int
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo
>>> conn=pymongo.Connection('10.0.0.35',20000)
>>> db=conn.test
>>> tianyc04=db.tianyc04.find()
#我们看,从python取出来的也是一个日期类型,一个字符串类型
>>> print tianyc04[0]
{u'mark_time': datetime.datetime(2013, 2, 2, 1, 52, 12, 281000), u'_id': ObjectId('510c714c045d7d8d7b6ec1bb'), u'mark': 1.0}
>>> print tianyc04[1]
{u'mark_time': u'Sat Feb 02 2013 09:52:17 GMT+0800', u'_id': ObjectId('510c7151045d7d8d7b6ec1bc'), u'mark': 1.0}
#我打印出mongo的isodate类型,发现并没有自动转换为GMT+0800时间:
>>> print tianyc04[0]['mark_time']
2013-02-02 01:52:12.281000
>>> print tianyc04[1]['mark_time']
Sat Feb 02 2013 09:52:17 GMT+0800

### 使用 MongoDB 构建图书馆管理系统的设计实现 #### 数据库设计原则 在构建图书馆管理系统时,数据库设计至关重要。考虑到图书、借阅者以及交易记录之间的关系复杂度,采用文档型数据库MongoDB可以灵活处理这些数据结构[^1]。 对于书籍信息存储,创建名为`books`集合来保存每本书的具体详情,字段可能包括但不限于:_id(唯一标识符),title(书名),author(作者),publisher(出版社),publish_date(出版日期)。为了便于查询操作,在此建议为常用检索条件建立索引提高效率[^2]。 针对读者资料,则设立另一个叫作`readers`的集合用于记载个人信息如姓名、联系方式等基本信息;同时还要有专门的空间用来追踪每位用户的借还状态——这可以通过引入第三个集合`borrow_records`完成,其中至少应包含reader_id, book_id 和 borrow_time三个属性以表示某位特定用户何时取走了哪一本书籍[^3]。 ```javascript // 创建 books 集合并插入一条测试数据 db.createCollection("books"); db.books.insertOne({ title: "The Great Gatsby", author: "F. Scott Fitzgerald", publisher: "Scribner", publish_date: ISODate("1925-04-10T00:00:00Z"), }); // 对于 readers 的定义同样简单明了 db.readers.insertOne({name:"张三", contact_info:"zhangsan@example.com"}); ``` 当涉及到实际业务逻辑层面的应用开发工作时,推荐利用Node.js配合Express框架快速搭建RESTful API接口服务端程序,并借助Mongoose ODM(Object Data Modeling)工具简化与MongoDB交互过程中的模型映射难题[^4]。 最后值得注意的是安全性考量方面的问题。由于涉及大量敏感信息传输交换活动,因此必须采取适当措施保障通信链路安全可靠,比如启用SSL/TLS加密机制保护网络层面上的数据完整性不受侵犯;另外还需注意权限控制策略设置合理有效防止未授权访问行为发生[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值