2013-07-24 21 views
8

ho un datastore MongoDB impostato con i dati sulla posizione memorizzati in questo modo:MongoDB - Interrogazione tra un intervallo di tempo di ore

{ 
"_id" : ObjectId("51d3e161ce87bb000792dc8d"), 
"datetime_recorded" : ISODate("2013-07-03T05:35:13Z"), 
"loc" : { 
    "coordinates" : [ 
     0.297716, 
     18.050614 
    ], 
    "type" : "Point" 
}, 
"vid" : "11111-22222-33333-44444" 
} 

Mi piacerebbe essere in grado di eseguire una query simile all'esempio date range ma invece su un intervallo di tempo . Ad esempio, recuperare tutti i punti registrati tra le 12:00 e le 16:00 (può essere eseguito anche con 1200 e 1600 ore di 24 ore).

ad es.

Con punti:

  • "datetime_recorded" : ISODate("2013-05-01T12:35:13Z"),
  • "datetime_recorded" : ISODate("2013-06-20T05:35:13Z"),
  • "datetime_recorded" : ISODate("2013-01-17T07:35:13Z"),
  • "datetime_recorded" : ISODate("2013-04-03T15:35:13Z"),

una query

db.points.find({'datetime_recorded': { 
    $gte: Date(1200 hours), 
    $lt: Date(1600 hours)} 
}); 

fornirebbe solo il primo e l'ultimo punto.

È possibile? O dovrei farlo per ogni giorno?

+1

Poiché Mongodb non dispone di operatori data/ora per le query normali, consiglierei di cambiare lo schema in modo da includere l'ora come campo distinto. Senza di esso, non sarai in grado di utilizzare un indice in modo efficiente per restringere i risultati. – WiredPrairie

risposta

7

Bene, il modo migliore per risolvere questo è store anche i minuti separatamente. Ma è possibile ottenere intorno a questo con il quadro di aggregazione, anche se questo è non sarà molto veloce:

db.so.aggregate([ 
    { $project: { 
     loc: 1, 
     vid: 1, 
     datetime_recorded: 1, 
     minutes: { $add: [ 
      { $multiply: [ { $hour: '$datetime_recorded' }, 60 ] }, 
      { $minute: '$datetime_recorded' } 
     ] } 
    } }, 
    { $match: { 'minutes' : { $gte : 12 * 60, $lt : 16 * 60 } } } 
]); 

Nella prima fase $project, si calcolano i minuti da hour * 60 + min che poi partita contro nel secondo passaggio: $match.

+0

hai ragione - non veloce! ma fa il lavoro :-) Upvoted ma solo andando a vedere se qualcuno può fornire un modo più veloce di farlo. Molte grazie! Potrebbe essere sufficiente un piccolo script pymongo per aggiornare in loop ognuno di essi con un'ora/minuti separatamente ... – Ewan

+0

Risposta accettata - Lavorando per ora su piccoli set di dati mentre ottengo un campo minuti/ore aggiunto. Grazie mille @Derick – Ewan

+7

yuk, come può essere la soluzione migliore in mongoDB? interrogare per intervallo di tempo non dovrebbe essere tempo di razzo – GreyCloud

Problemi correlati