如何从 MongoDB id 获取时间戳?
时间戳包含在 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 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
获取最后添加的行的日期:
完成后删除数据库:
> 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
_id
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方法:
$convert
db.Items.find({}, { creationTime: {"$convert":{"input":"$_id", "to":"date"}}});