2013-08-14 17 views
14

sto cominciando con MongoDB, e sto cercando di interrogare il mio db che hanno questo formato di documento:query per ottenere ultimi X minuti di dati con MongoDB

{ "_id" : ObjectId("520b8b3f8bd94741bf006033"), "value" : 0.664, "timestamp" : ISODate("2013-08-14T13:48:35Z"), "cr" : ISODate("2013-08-14T13:50:55.834Z") } 

posso ottenere gli ultimi record da un datetime con questa query:

> db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1}); 

Ma sto cercando di ottenere un set con i campi valore e timestamp di 18 minuti fa, come posso creare una query per questo? Grazie a tutti per la vostra pazienza ...

+1

Vai a questa [domanda] (http://stackoverflow.com/questions/1197928/how-to-add-30-minutes-to -a-javascript-date-object) per come aggiungere minuti a una data, dovresti essere in grado di usarlo per prendere 18 minuti dalla data. –

+0

Grazie @AlistairNelson sembra che ho capito ... – Goku

risposta

40

Per la parte 18 minuti, che non è davvero di MongoDB, ma su JavaScript e ciò che è disponibile nella shell mongo:

query = { 
    timestamp: { // 18 minutes ago (from now) 
     $gt: new Date(ISODate().getTime() - 1000 * 60 * 18) 
    } 
} 

Funziona nella shell mongo, ma l'utilizzo di driver Mongo per altre lingue sarebbe molto diverso.

Per "progetto" su uno schema più piccolo con entrambi i valori e timestamp:

projection = { 
    _id: 0, 
    value: 1, 
    timestamp: 1, 
} 

L'applicazione di entrambi:

db.mycol.find(query, projection).sort({timestamp: 1}); 

Beh, questo non è ancora un "set", in quanto ci potrebbe essere duplicati. Per sbarazzarsi di loro è possibile utilizzare il $group dal quadro di aggregazione:

db.mycol.aggregate([ 
    {$match: query}, 
    {$group: { 
     _id: { 
      value: "$value", 
      timestamp: "$timestamp", 
     } 
    }}, 
    {$project: { 
     value: "$_id.value", 
     timestamp: "$_id.timestamp", 
    }}, 
    {$sort: {timestamp: 1}}, 
]) 
+0

THanks @ H.D per la tua risposta, è molto chiaro ... – Goku

+0

se hai bisogno di una query che funzioni al di fuori della shell mongo, non puoi usare la risposta di cui sopra. Dovrai proiettare un campo diverso nel tempo: 'time_diff: {$ sottrarre: [Date() -" $ time "]}' come parte dell'aggregazione e quindi confrontare con: 'time_diff: {$ lte:" $ time_diff "}'. – guyarad

2

Wow, grazie a @Alistair_Nelson sono riuscito a ottenere i dati da n minuti fa, ad esempio per ottenere gli ultimi 18 minuti da ISODate ("2013-08-14T14: 00 : 00Z "):

db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}}) 

Per ottenere solo i campi di cui ho bisogno:

db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}},{value:1,timestamp:1, _id:0}) 
Problemi correlati