2012-11-27 6 views
18

Ich habe eine Sammlung, die wie folgt aussieht:MongoDB: Führen Sie einen Datumsbereich Abfrage aus der ObjectId im Mongo Mantel

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

Ich möchte eine Bereichsabfrage tun Datensätze zwischen zwei Terminen zu finden. Ich weiß, dass ich das Datum aus dem ObjectId im Mongo Mantel var dies zu tun bekommen:

var aDate = ObjectId().getTimestamp() 

aber es ist keine Art und Weise (soweit ich im Moment herausfinden kann) eine ObjectId zu schaffen, bestehend nur der Zeitstempel Teil - ich glaube, meine ideale Lösung ist nicht funktionierende mongo Shell-Code wäre:

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

Verwenden Sie den Fund mit dem minDate und MaxDate wie die Bereichswerte.

Gibt es eine Möglichkeit, dies in der Shell zu tun - ich bin nicht an einigen der Treiberprodukte interessiert.

+0

Erste 8 Bytes von Mongoid sind Zeitstempel in Hexadezimal, so dass Sie eine gültige ObjectId mit ersten 8 Bytes aus Datum erstellt, und nur Nullen und dann Fragen wie folgt: '{ \t _id: {$ gt: ObjektId (" 5087e5b106cffca815000000 ")} }' –

+0

Es gibt eine gute Antwort für [Kann ich MongoDB ObjectId nach Datum abfragen?] (http: // stackoverflow. com/questions/8749971/can-i-query-mongodb-objectid-by-date), das eine 'objectIdWithTimestamp()' JavaScript-Funktion enthält. Sie können diese Funktion in Ihrer [.mongorc.js] (http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell#Overview-TheMongoDBInteractiveShell-mongorc.js) speichern Es ist beim Start in Ihrer 'mongo'-Shell verfügbar. – Stennie

Antwort

27

Sie können tun, dass zwei Schritte:

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

oder in einem Schritt (was weniger lesbar):

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

oder noch besser: 'Funktion dateFromObj (strDate) { Rückgabe ObjectId (Math.floor ((neues Datum (strDate))/1000) .toString (16) +" 0000000000000000 ") }' –

3

mit Mongo Mantel:

Sie die ObjectId verwenden können .fromDatum eingebaut Methode:

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

von node.js Treiber können Sie die von @jksdua zur Verfügung gestellte Lösung here

Verwandte Themen