Получение метки времени от идентификатора mongodb

Как получить метку времени из идентификатора MongoDB?

Ответ 1

Временная метка содержится в первых 4 байтах идентификатора mongoDB (см. http://www.mongodb.org/display/DOCS/Object+IDs).

Итак, ваша метка времени:

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

и

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

Ответ 2

По состоянию на Mongo 2.2 это изменилось (см.: http://docs.mongodb.org/manual/core/object-id/)

Вы можете сделать это всего за один шаг внутри оболочки mongo:

document._id.getTimestamp();

Это вернет объект Date.

Ответ 3

Получите метку времени из элемента коллекции mongoDB с помощью пошагового руководства:

Отметка времени скрыта глубоко в недрах объекта mongodb. Следуйте и оставайтесь морозными.

Войти в оболочку mongodb

[email protected]:~$ 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")

Преобразовать экземпляр даты в гггг-ММ-дд

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

получить его в формате гггг-мм-дд для каждой строки:

> 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

Получить каждую строку в формате гггг-мм-дд чч: мм: сс:

> 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 веб-масштаб.

Ответ 4

Вот быстрая PHP-функция для всех вас;)

public static function makeDate($mongoId) {

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

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

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

Ответ 5

В стороне сервера сделайте _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);
};