2016-01-03 2 views
3

Почему мы когда created_at поле, когда timestamp можно найти в первых 4 байтах ObjectIdПочему мы должны created_at в MongoDB

ObjectId("5349b4ddd2781d08c09890f4").getTimestamp() 

Взятый из MongoDB Docs

+3

Нам это не нужно. Но реальное поле даты облегчает фактическое извлечение/манипулирование меткой времени (нет необходимости ее преобразовывать), но, особенно, я думаю, гораздо легче фильтровать ее при запросе документов. – bardzusny

+0

Если бы вы ответили, я бы определенно согласился с этим. – Eduard

+1

Следует также отметить, что в операторах запросов для метки времени в _id все еще не существует, и не все драйверы обеспечивают достойный помощник для создания основанных на времени _ids – Sammaye

ответ

4

Как вы сказали, как она четко сказано в documentation:

с _ID ObjectId по умолчанию сохраняет 4 байта метки времени, в большинстве случаев вы не требуется для хранения времени создания любого документа.

И вы можете использовать ObjectId("5349b4ddd2781d08c09890f4").getTimestamp(), чтобы получить дату создания в формате даты ISO.

Также заказчику (нам) необходимо также иметь такую ​​услугу, поскольку это делает нашу попытку получить дату создания и выполнить действия на нем гораздо более интуитивно и легко.

+3

Но имейте в виду, что некоторые фреймворки генерируют ObjectId по-разному. Например: «Метеорные состояния». Значения «ObjectID», созданные Meteor, не будут иметь значимых ответов на их метод getTimestamp, поскольку Meteor в настоящее время их полностью создает ». http://docs.meteor.com/api/collections.html#Mongo-ObjectID – Gwened

3

Есть несколько случаев, когда это имеет смысл сделать так:

  1. Когда вам нужно лучше точность - ObjectId.getTimestamp() точен до секунды, в то время как Date поля магазина миллисекунды. Сравните это с mongo оболочкой: new Date() дает ISODate("2016-01-03T21:21:38.032Z"), а ObjectId().getTimestamp() - ISODate("2016-01-03T21:21:50Z").

  2. Когда вы не используете ObjectId вообще - это часто воспринимается как само собой разумеющееся, что _id поле должны быть заполнены ObjectId, в то время как на самом деле ObjectId только по умолчанию используется большинством водителей и MongoDB itself doesn't impose it - на напротив, рекомендуется использовать любой «естественный» уникальный идентификатор, если он существует для документов. В этом случае, хотя вам придется хранить «временную метку создания» самостоятельно, если вам это нужно.

  3. Удобство использования - если вы полагаетесь на присутствие этого поля и данных в нем, возможно, было бы лучше, по крайней мере, с точки зрения дизайна, быть явным. Это скорее вопрос вкуса. Однако, как отмечено в комментариях, если вы также хотите фильтровать или сортировать по «временной отметке создания», то будет проще сделать выделенное поле для него и использовать операторы запросов, например, $gt, например, непосредственно на нем.

Смежные вопросы