MongoMapper: Finden aller Dokumente, die an einem bestimmten Datum erstellt wurden

  • Ich muss eine Abfrage schreiben, die alle an einem bestimmten Datum erstellten Dokumente findet.

    Nehmen wir an, dass das Datum heute ist.

    Ich habe folgendes versucht:

     Document.all(:created_at => Date.parse(Time.now.strftime('%Y/%m/%d')))
     

    aber ich bekam:

    Kann ein Objekt der Klasse Date nicht in BSON serialisieren.

    Vielen Dank für Ihre Hilfe.

    UPDATE Dieser Link erklärt, wie Sie dies tun Datumsbereichsabfragen mit MongoMapper .

     Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )
     
    22 November 2011
    Laura
3 answers
  • UPDATE: Dieser Link erläutert, wie dies geschieht Datumsbereich Abfragen mit MongoMapper .

     Document.count( :created_at => { '$gt' => 2.days.ago.midnight, '$lt' => 1.day.ago.midnight } )
     
    12 January 2012
    Laura
  • Verwenden Sie stattdessen einfach Time.now. Der Ruby-Treiber kann mit Zeitobjekten umgehen.

     doc = {:created_at => Time.now}
     

    oder

     doc = {:created_at => Time.utc(12,1,12)} # year, month, day
     

    Dann können Sie testen, ob das Dokument serialisiert wird, ohne einen Fehler in irb wie folgt auszulösen:

     require 'bson'
    
    BSON.serialize(doc)
     

    Wenn Sie eine Fehlermeldung erhalten, versuchen Sie es erneut. Wenn es ein serialisiertes bson-Objekt ausspuckt, sind Sie bereit zu gehen!

    Wenn Sie neugierig sind, überprüfen Sie die Quelle der Methode to_mongo im Mongomapper-Treiber hier

    22 November 2011
    Tyler Brock
  • Ihr :created_at ist ein Datum (wie in "Datum im JavaScript-Stil mit Datums- und Uhrzeitkomponenten"), richtig? Sie müssen die Grenzen des fraglichen Datums in UTC herausfinden, Time -Instanzen für diese Grenzen erstellen und dann zwischen diesen Zeitpunkten nach allem suchen.

    Angenommen, dies Ihre lokale Zeitzone ist korrekt konfiguriert, und Sie möchten alles, was am 21.11.2011 erstellt wurde. Dann sollten Sie so etwas wie dieses Ziel erreichen:

     start_time = Time.new(2011,11,21, 0,0,0).utc
    end_time   = Time.new(2011,11,22, 0,0,0).utc
    docs       = Document.where(:created_at => { :$gte => start_time }).
                          where(:created_at => { :$lt  => end_time   })
     

    Sie könnten auch Time.new(2011, 11, 21).utc und Time.new(2011, 11, 22).utc verwenden, aber ich mag die zusätzlichen Nullen als Erinnerung daran, dass ich nicht wirklich nur mit einem Datum arbeite.

    22 November 2011
    mu is too short