2012-11-27 11 views
18

ho una collezione che assomiglia a questo:MongoDB: Eseguire una query Periodo dal ObjectId nella shell mongo

{ 
    _id: ObjectId("50a68673476427844b000001"), 
    other fields 
} 

voglio fare una query gamma per trovare i record tra due date. So che posso ottenere la data dal ObjectId nella shell mongo var fare questo:

var aDate = ObjectId().getTimestamp() 

ma non c'è un modo (per quanto posso capire, al momento) per creare un composto ObjectId del solo la porzione timestamp - penso che la mia soluzione ideale è non funzionante codice shell mongo sarebbe:

var minDate = ObjectId(new Date("2012-11-10")); 
var maxDate = ObjectId(new Date("2012-11-17")); 

Utilizzare il ritrovamento con la MinDate e MaxDate come i valori di intervallo.

C'è un modo per farlo in SHELL - Non sono interessato ad alcuni dei prodotti del driver.

+0

I primi 8 byte di mongoid sono timestamp in esadecimali, quindi è possibile creare un ObjectId valido con i primi 8 byte creati dalla data e riposare solo zero e quindi fare query simili a questo: '{ \t _id: {$ gt: ObjectId (" 5087e5b106cffca815000000 ")} }' –

+0

C'è una buona risposta per [Posso interrogare MongoDB ObjectId per data?] (http: // stackoverflow. it/questions/8749971/can-i-query-mongodb-objectid-by-date) che include una funzione JavaScript 'objectIdWithTimestamp()'. Puoi salvare questa funzione nel tuo [.mongorc.js] (http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell#Overview-TheMongoDBInteractiveShell-.mongorc.js) per avere disponibile nella shell 'mongo' all'avvio. – Stennie

risposta

27

Si può fare in 2 fasi:

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

o in un unico passaggio (ciò che è meno leggibile):

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")}}) 
+0

o anche meglio: 'function dateFromObj (strDate) { return ObjectId (Math.floor ((new Date (strDate))/1000) .toString (16) +" 0000000000000000 ") }' –

3

utilizzando shell mongo:

è possibile utilizzare l'ObjectId .da data metodo integrato:

db.mycollection.find({_id:{$gt:ObjectId.fromDate(new Date('2017-09-23'))}}); 

dal driver node.js è possibile utilizzare la soluzione fornita da @jksdua here

Problemi correlati