Как мне извлечь созданную дату из Монго ObjectID
Я использую оболочку Mongo для запроса моей базы данных Mongo. Я хочу использовать метку времени, содержащуюся в ObjectID, как часть моего запроса, а также как столбец для извлечения в вывод. Я настроил Mongo для создания ObjectID самостоятельно.
Моя проблема в том, что я не могу узнать, как работать с ObjectID, чтобы извлечь его метку времени.
Вот вопросы, которые я пытаюсь получить. Поле createDate является заполнителем; не уверен, что правильное поле:
//Find everything created since 1/1/2011
db.myCollection.find({date: {$gt: new Date(2011,1,1)}});
//Find everything and return their createdDates
db.myCollection.find({},{createdDate:1});
3 ответа
getTimestamp()
Эта функция вам нужна, она уже включена в оболочку:
ObjectId.prototype.getTimestamp = function() {
return new Date(parseInt(this.toString().slice(0,8), 16)*1000);
}
Рекомендации
Проверьте этот раздел из документов:
Этот модульный тест также демонстрирует то же самое:
Пример использования оболочки Mongo:
> db.col.insert( { name: "Foo" } );
> var doc = db.col.findOne( { name: "Foo" } );
> var timestamp = doc._id.getTimestamp();
> print(timestamp);
Wed Sep 07 2011 18:37:37 GMT+1000 (AUS Eastern Standard Time)
> printjson(timestamp);
ISODate("2011-09-07T08:37:37Z")
Этот вопрос полезен для понимания того, как использовать встроенную временную метку _id в ситуациях запроса (см. Документацию Mongo Extended JSON). Вот как это делается:
col.find({...,
'_id' : {'$lt' : {'$oid' : '50314b8e9bcf000000000000'}}
})
находит документы, созданные ранее, чем тот, который передал oid. В сочетании с естественной сортировкой и ограничением вы можете использовать BSON _ids для создания запросов, подобных API Twitter (дайте мне последний OID, который у вас есть, и я предоставлю еще двадцать)
В Python вы можете сделать это:
>>> from bson.objectid import ObjectId
>>> gen_time = datetime.datetime(2010, 1, 1)
>>> dummy_id = ObjectId.from_datetime(gen_time)
>>> result = collection.find({"_id": {"$lt": dummy_id}})
Я думаю, ObjectId.from_datetime() - это полезный метод стандартной библиотеки bson. Возможно, у других языковых привязок есть альтернативная встроенная функция. Источник: http://api.mongodb.org/python/current/api/bson/objectid.html
Чтобы использовать метку времени, содержащуюся в ObjectId, и возвращать документы, созданные после определенной даты, вы можете использовать
$where
с функцией.
например
db.yourcollection.find( {
$where: function() {
return this._id.getTimestamp() > new Date("2020-10-01")
}
});
Функция должна вернуть истинное значение, чтобы этот документ был включен в результаты. Ссылка: $ where
Однако объекты даты Mongo могут показаться немного странными. Подробную информацию о конструкторе см. В документации mongo Date ().
выдержка:
You can specify a particular date by passing an ISO-8601 date string with a year within the inclusive range 0 through 9999 to the new Date() constructor or the ISODate() function. These functions accept the following formats:
new Date("<YYYY-mm-dd>") returns the ISODate with the specified date.
new Date("<YYYY-mm-ddTHH:MM:ss>") specifies the datetime in the client’s local timezone and returns the ISODate with the specified datetime in UTC.
new Date("<YYYY-mm-ddTHH:MM:ssZ>") specifies the datetime in UTC and returns the ISODate with the specified datetime in UTC.
new Date(<integer>) specifies the datetime as milliseconds since the Unix epoch (Jan 1, 1970), and returns the resulting ISODate instance.