Trova oggetti tra due date MongoDB

Ho giocato a memorizzare tweet all’interno di mongodb, ogni object assomiglia a questo:

{ "_id" : ObjectId("4c02c58de500fe1be1000005"), "contributors" : null, "text" : "Hello world", "user" : { "following" : null, "followers_count" : 5, "utc_offset" : null, "location" : "", "profile_text_color" : "000000", "friends_count" : 11, "profile_link_color" : "0000ff", "verified" : false, "protected" : false, "url" : null, "contributors_enabled" : false, "created_at" : "Sun May 30 18:47:06 +0000 2010", "geo_enabled" : false, "profile_sidebar_border_color" : "87bc44", "statuses_count" : 13, "favourites_count" : 0, "description" : "", "notifications" : null, "profile_background_tile" : false, "lang" : "en", "id" : 149978111, "time_zone" : null, "profile_sidebar_fill_color" : "e0ff92" }, "geo" : null, "coordinates" : null, "in_reply_to_user_id" : 149183152, "place" : null, "created_at" : "Sun May 30 20:07:35 +0000 2010", "source" : "web", "in_reply_to_status_id" : { "floatApprox" : 15061797850 }, "truncated" : false, "favorited" : false, "id" : { "floatApprox" : 15061838001 } 

Come scriverò una query che controlla il created_at e trova tutti gli oggetti tra le 18:47 e le 19:00? Devo aggiornare i miei documenti in modo che le date siano memorizzate in un formato specifico?

La ricerca di un intervallo di date (mese o giorno specifico) nel libro di ricette MongoDB ha un’ottima spiegazione in merito, ma qui di seguito è una cosa che ho provato personalmente e sembra funzionare.

 items.save({ name: "example", created_at: ISODate("2010-04-30T00:00:00.000Z") }) items.find({ created_at: { $gte: ISODate("2010-04-29T00:00:00.000Z"), $lt: ISODate("2010-05-01T00:00:00.000Z") } }) => { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" } 

Sulla base dei miei esperimenti, è necessario serializzare le date in un formato supportato da MongoDB, in quanto i seguenti risultati di ricerca indesiderati.

 items.save({ name: "example", created_at: "Sun May 30 18.49:00 +0000 2010" }) items.find({ created_at: { $gte:"Mon May 30 18:47:00 +0000 2015", $lt: "Sun May 30 20:40:36 +0000 2010" } }) => { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" } 

Nel secondo esempio non erano previsti risultati, ma ce n’era ancora uno ottenuto. Questo perché viene eseguito un confronto di stringhe di base.

Chiarire. Ciò che è importante sapere è che:

  • Sì, devi passare un object Date Javascript.
  • Sì, deve essere compatibile con ISODate
  • Sì, dalla mia esperienza nel far funzionare tutto questo, è necessario manipolare la data su ISO
  • Sì, lavorare con le date è in genere sempre un processo noioso, e mongo non fa eccezione

Ecco uno snippet di codice funzionante, dove facciamo un po ‘di manipolazione delle date per garantire Mongo (qui sto usando il modulo mangusta e voglio i risultati per le righe il cui attributo date è inferiore a (prima) la data indicata come parametro myDate) può gestire correttamente:

 var inputDate = new Date(myDate.toISOString()); MyModel.find({ 'date': { $lte: inputDate } }) 

MongoDB memorizza i millis di una data come int (64), come prescritto da http://bsonspec.org/#/specification

Tuttavia, può diventare piuttosto confuso quando si recuperano le date in quanto il driver client istanzia un object data con il proprio fuso orario locale. Il driver JavaScript nella console mongo lo farà sicuramente.

Quindi, se ti interessano i tuoi fusi orari, assicurati di sapere che cosa dovrebbe essere quando lo riprendi. Questo non dovrebbe importare molto per le query, in quanto equivarrà ugualmente allo stesso int (64), indipendentemente dal fuso orario in cui si trova l’object della data (spero). Ma farei sicuramente delle query con gli oggetti data reali (non le stringhe) e lasciare che il driver faccia le sue cose.

 db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count(); 

Sostituisci la collection con il nome della raccolta che desideri eseguire

Python e pymongo

Trovare oggetti tra due date in Python con pymongo nei posts raccolta (basato sul tutorial ):

 from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000) to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000) for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}): print(post) 

Dove {"$gte": from_date, "$lt": to_date} specifica l’intervallo in termini di tipi datetime.datetime .

Converti le tue date in fuso orario GMT mentre li stai caricando in Mongo. In questo modo non c’è mai un problema di fuso orario. Quindi basta fare i calcoli sul campo twitter / timezone quando si estraggono i dati per la presentazione.

Perché non convertire la stringa in un numero intero del modulo YYYYMMDDHHMMSS? Ogni incremento di tempo creerebbe quindi un numero intero più grande e si può filtrare sui numeri interi invece di preoccuparsi della conversione in tempo ISO.

Usa questo codice per trovare il record tra due date usando $gte e $lt :

 db.CollectionName.find({"whenCreated": { '$gte': ISODate("2018-03-06T13:10:40.294Z"), '$lt': ISODate("2018-05-06T13:10:40.294Z") }}); 

ho provato in questo modello secondo le mie esigenze ho bisogno di memorizzare una data quando mai un object viene creato in seguito voglio recuperare tutti i record (documenti) tra due date nel mio file html stavo usando il seguente formato mm / gg / aaaa

        
from to

nel mio file py (python) l’ho convertito in “iso fomate” nel modo seguente

 date_str1 = request.POST["SelectedDate1"] SelectedDate1 = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat() 

e salvato nella mia collezione dbmongo con “SelectedDate” come campo nella mia collezione

per recuperare dati o documenti tra 2 date ho usato seguente query

 db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}}) 

usa $ get e $ lt per trovare tra i dati di data in mongodb

 var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD"); db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lt: new Date(tomorrowDate + "T23:59:59.999Z")}})