如何从MongoDB ID获取时间戳?

时间戳记包含在mongoDB ID的前4个字节中(请参阅:http://www.mongodb.org/display/DOCS/Object+ID)。

因此,您的时间戳是:

1
timestamp = _id.toString().substring(0,8)

1
date new Date( parseInt( timestamp16 1000 )

从Mongo 2.2开始,这种情况已经改变(请参阅:http://docs.mongodb.org/manual/core/object-id/)

您可以在mongo shell内一步完成全部操作:

1
document._id.getTimestamp();

这将返回一个Date对象。

通过演练从mongoDB集合项获取时间戳:

 

时间戳被埋在mongodb对象的肠子深处。跟随并保持霜冻。

登录到mongodb shell

1
2
3
ubuntu@ip-10-0-1-223:~$ mongo 10.0.1.223
MongoDB shell version: 2.4.9
connecting to: 10.0.1.223/test

通过插入项目创建数据库

1
2
3
> db.penguins.insert({"penguin":"skipper"})
> db.penguins.insert({"penguin":"kowalski"})
>

检查是否存在:

1
2
3
> show dbs
local      0.078125GB
penguins   0.203125GB

让该数据库成为我们现在使用的数据库

1
2
> use penguins
switched to db penguins

获取ISODate:

1
2
> ISODate("2013-03-01")
ISODate("2013-03-01T00:00:00Z")

打印一些json:

1
2
> printjson({"foo":"bar"})
{"foo" :"bar" }

获取行:

1
2
3
> db.penguins.find()
{"_id" : ObjectId("5498da1bf83a61f58ef6c6d5"),"penguin" :"skipper" }
{"_id" : ObjectId("5498da28f83a61f58ef6c6d6"),"penguin" :"kowalski" }

我们只想检查一行

1
2
> db.penguins.findOne()
{"_id" : ObjectId("5498da1bf83a61f58ef6c6d5"),"penguin" :"skipper" }

获取该行的_id:

1
2
> db.penguins.findOne()._id
ObjectId("5498da1bf83a61f58ef6c6d5")

从_id对象获取时间戳:

1
2
> db.penguins.findOne()._id.getTimestamp()
ISODate("2014-12-23T02:57:31Z")

获取最后添加的记录的时间戳:

1
2
> db.penguins.find().sort({_id:-1}).limit(1).forEach(function (doc){ print(doc._id.getTimestamp()})
Tue Dec 23 2014 03:04:53 GMT+0000 (UTC)

示例循环,打印字符串:

1
2
3
> db.penguins.find().forEach(function (doc){ print("hi"})
hi
hi

示例循环与find()一样,打印行

1
2
3
> db.penguins.find().forEach(function (doc){ printjson(doc})
{"_id" : ObjectId("5498dbc9f83a61f58ef6c6d7"),"penguin" :"skipper" }
{"_id" : ObjectId("5498dbd5f83a61f58ef6c6d8"),"penguin" :"kowalski" }

循环,获取系统日期:

1
2
3
4
5
6
7
8
9
10
11
> db.penguins.find().forEach(function (doc){ doc["timestamp_field"new Date(); printjson(doc)})
{
       "_id" : ObjectId("5498dbc9f83a61f58ef6c6d7"),
       "penguin" :"skipper",
       "timestamp_field" : ISODate("2014-12-23T03:15:56.257Z")
}
{
       "_id" : ObjectId("5498dbd5f83a61f58ef6c6d8"),
       "penguin" :"kowalski",
       "timestamp_field" : ISODate("2014-12-23T03:15:56.258Z")
}

循环,获取每一行的日期:

1
2
3
4
5
6
7
8
9
10
11
> db.penguins.find().forEach(function (doc){ doc["timestamp_field"= doc._id.getTimestamp(); printjson(doc)})
{
       "_id" : ObjectId("5498dbc9f83a61f58ef6c6d7"),
       "penguin" :"skipper",
       "timestamp_field" : ISODate("2014-12-23T03:04:41Z")
}
{
       "_id" : ObjectId("5498dbd5f83a61f58ef6c6d8"),
       "penguin" :"kowalski",
       "timestamp_field" : ISODate("2014-12-23T03:04:53Z")
}

仅过滤日期

1
2
3
> db.penguins.find().forEach(function (doc){ doc["timestamp_field"= doc._id.getTimestamp(); printjson(doc["timestamp_field"])})
ISODate("2014-12-23T03:04:41Z")
ISODate("2014-12-23T03:04:53Z")

仅对字符串进一步过滤:

1
2
3
> db.penguins.find().forEach(function (doc){ doc["timestamp_field"= doc._id.getTimestamp(); print(doc["timestamp_field"]})
Tue Dec 23 2014 03:04:41 GMT+0000 (UTC)
Tue Dec 23 2014 03:04:53 GMT+0000 (UTC)

打印空日期,获取其类型,分配日期:

1
2
3
4
5
6
> print(new Date())
Tue Dec 23 2014 03:30:49 GMT+0000 (UTC)
typeof new Date()
object
new Date("11/21/2012");
ISODate("2012-11-21T00:00:00Z")

将日期实例转换为yyyy-MM-dd

1
2
> print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate())
2014-1-1

每行以yyyy-MM-dd格式获取:

1
2
3
> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()})
2014-12-23
2014-12-23

toLocaleDateString比较简短:

1
2
3
> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.toLocaleDateString()})
Tuesday, December 232014
Tuesday, December 232014

以yyyy-MM-dd HH:mm:ss格式获取每一行:

1
2
3
> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate(+"" + d.getHours(+":" + d.getMinutes(+":" + d.getSeconds()})
2014-12-23 3:4:41
2014-12-23 3:4:53

获取最后添加的行的日期:

1
2
> db.penguins.find().sort({_id:-1}).limit(1).forEach(function (doc){ print(doc._id.getTimestamp()})
Tue Dec 23 2014 03:04:53 GMT+0000 (UTC)

完成后删除数据库:

1
2
3
4
> use penguins
switched to db penguins
> db.dropDatabase()
{"dropped" :"penguins","ok" }

确保它不存在:

1
2
3
> show dbs
local   0.078125GB
test    (empty)

现在您的MongoDB是webscale。

 


这是适合大家的快速php函数;)

1
2
3
4
5
6
7
8
public static function makeDate($mongoId{

    $timestamp = intval(substr($mongoId08)16);

    $datum (new DateTime())->setTimestamp($timestamp);

    return $datum->format('d/m/Y');
}

在服务器端,使MongoDB ObjectId为_id

date = new Date( parseInt( _id.toString().substring(0,8), 16 ) * 1000 )

并在客户端使用

1
2
3
var dateFromObjectId function (objectId{
return new Date(parseInt(objectId.substring(08)161000);
};
 posted on 2021-08-04 15:30  xibuhaohao  阅读(379)  评论(0编辑  收藏  举报