July 2, 2022

ObjectId в MongoDB содержит timestamp

На днях коллега пожаловался что ему нужно вытащить часть записей за определенный период, размером в день, из коллекции с много млн. записей. Прошлый разработчик не проставил индексов, потому даже его внуки не дождутся результата запроса.

Есть одна очень простая хитрость, даже скорее просто понимание основ. Первые 4 байта ObjectId это timestamp. Берете нужный вам период в timestamp, переводите в hex, остаток забиваете нулями, вот так: ObjectId('62c049650000000000000000').

Делаете запросы $gt, $lt, _id имеет индекс по умолчанию, так что проблем быть не должно.

Короче, RTFM!

https://www.mongodb.com/docs/manual/reference/method/ObjectId/