Mongodb: Выполните запрос диапазона дат из ObjectId в оболочке mongo
У меня есть коллекция, которая выглядит так:
{
_id: ObjectId("50a68673476427844b000001"),
other fields
}
Я хочу сделать запрос диапазона, чтобы найти записи между двумя датами. Я знаю, что я могу получить дату из ObjectId в оболочке mongo var:
var aDate = ObjectId().getTimestamp()
но нет способа (насколько я могу понять на данный момент) создать ObjectId, состоящий только из части timestamp - я думаю, что моим идеальным решением является неработающий код оболочки mongo:
var minDate = ObjectId(new Date("2012-11-10"));
var maxDate = ObjectId(new Date("2012-11-17"));
Используйте find с minDate и MaxDate в качестве значений диапазона.
Есть ли способ сделать это в SHELL - меня не интересуют некоторые из продуктов драйвера.
Ответы
Ответ 1
Вы можете сделать это за 2 шага:
var objIdMin = ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "000
0000000000000")
var objIdMax = ObjectId(Math.floor((new Date('2011/10/22'))/1000).toString(16) + "000
0000000000000")
db.myCollection.find({_id:{$gt: objIdMin, $lt: objIdMax}})
или в один шаг (что менее читаемо):
db.myCollection.find({_id:{$gt: ObjectId(Math.floor((new Date('1990/10/10'))/1000).toString(16) + "000
0000000000000"), $lt: ObjectId(Math.floor((new Date('2011/10/10'))/1000).toString(16) + "000
0000000000000")}})
Ответ 2
используя оболочку монго:
Вы можете использовать встроенный метод ObjectId.fromDate:
db.mycollection.find({_id: {$gt: ObjectId.fromDate( new Date('2017-09-23') ) } });
из драйвера Node.js:
Вы можете использовать решение, предоставленное @jksdua здесь следующим образом:
db.mycollection.find({_id: {$gt: ObjectID.createFromTime( Date.now()/1000 ) } });