从 mongodb id 获取时间戳

如何从 MongoDB id 获取时间戳?

63252 次浏览

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

所以你的时间戳是:

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

还有

date = new Date( parseInt( timestamp, 16 ) * 1000 )

到 Mongo 2.2时,这已经改变了(参见: http://docs.mongodb.org/manual/core/object-id/)

您可以在 mongo shell 中一步完成所有这些操作:

document._id.getTimestamp();

这将返回 Date 对象。

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

时间戳深埋在 mongodb 对象的内部。

登录到 mongodb shell

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

通过插入项创建数据库

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

检查是否存在:

> show dbs
local      0.078125GB
penguins   0.203125GB

让我们把那个数据库变成我们现在的数据库

> use penguins
switched to db penguins

给自己买个 ISODate:

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

打印一些 json:

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

把排数拿回来:

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

我们只想检查一行

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

获取该行的 id:

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

从 _ id 对象获取时间戳:

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

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

> 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)

示例循环,打印字符串:

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

示例循环,与 find ()相同,打印行

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

循环,得到系统日期:

> 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")
}

循环,获取每行的日期:

> 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")
}

过滤到日期

> 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")

进一步筛选字符串:

> 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)

打印一个空白日期,得到它的类型,分配一个日期:

> 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")

将 date 实例转换为 yyyy-MM-dd

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

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

> 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 更简洁:

> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.toLocaleDateString()) })
Tuesday, December 23, 2014
Tuesday, December 23, 2014

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

> 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

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

> 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)

完成后删除数据库:

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

确保它消失:

> show dbs
local   0.078125GB
test    (empty)

现在您的 MongoDB 是 webscale。

这里有一个针对所有人的快速 php 函数;)

public static function makeDate($mongoId) {


$timestamp = intval(substr($mongoId, 0, 8), 16);


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


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

服务器端中,使 _id为 MongoDB ObjectId

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

还有 客户端的使用

var dateFromObjectId = function (objectId) {
return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
};

来自 官方文件:

ObjectId('mongodbIdGoesHere').getTimestamp();

如果需要从 GoLang 中的 MongoID 获取时间戳:

package main


import (
"fmt"
"github.com/pkg/errors"
"strconv"
)


const (
mongoIDLength = 24
)


var ErrInvalidMongoID = errors.New("invalid mongoID provided")


func main() {
s, err := ExtractTimestampFromMongoID("5eea13924a04cb4b58fe31e3")
if err != nil {
fmt.Print(err)
return
}


fmt.Printf("%T, %v\n", s, s)


// convert to usual int
usualInt := int(s)


fmt.Printf("%T, %v\n", usualInt, usualInt)
}


func ExtractTimestampFromMongoID(mongoID string) (int64, error) {
if len(mongoID) != mongoIDLength {
return 0, errors.WithStack(ErrInvalidMongoID)
}


s, err := strconv.ParseInt(mongoID[0:8], 16, 0)
if err != nil {
return 0, err
}


return s, nil
}

操场: https://play.golang.org/p/lB9xSCmsP8I

在 mongoDB 上找到

db.books.find({}).limit(10).map(function (v) {
let data = v
data.my_date = v._id.getTimestamp()
return data
})

使用如下 $convert方法:

db.Items.find({}, { creationTime: {"$convert":{"input":"$_id", "to":"date"}}});