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 ) } });