2013-08-14 10 views
14

Zaczynam z MongoDB, a ja staram się zapytać mojego db, które mają ten format dokumentu:Zapytanie dostać ostatnią X minut dane z MongoDB

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

mogę dostać ostatnią rekordy z datetime z tego zapytania:

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

ale staram się dostać zestaw z pola wartości i znaczników czasu od 18 minut temu, w jaki sposób można zbudować zapytanie do tego? Dziękuję wszystkim za cierpliwość ...

+1

Zobacz ten [Pytanie] (http://stackoverflow.com/questions/1197928/how-to-add-30-minutes-to -a-javascript-date-object), aby dodać minuty do daty, powinieneś być w stanie wykorzystać to, aby 18 minut od daty. –

+0

Dzięki @AlistairNelson wydaje się, że mam to ... – Goku

Odpowiedz

40

Dla 18 minut części, to nie jest tak naprawdę o MongoDB, ale o JavaScript i co jest dostępne w powłoce Mongo:

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

Działa w powłoce Mongo, ale używanie sterowników Mongo w innych językach byłoby naprawdę inne.

Do „Projekt” nad mniejszym schematu z obu wartości i znaczników czasu:

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

Stosując zarówno:

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

Dobrze, że nie jest jeszcze „set”, ponieważ nie mogą się powtarzać. Aby pozbyć się z nich można użyć $group z ram agregacji:

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 za odpowiedź, jest bardzo jasne ... – Goku

+0

jeśli potrzebujesz kwerendy, która działa poza powłoką mongo, nie można użyć powyższej odpowiedzi. Będziesz musiał wyświetlać czas w innym polu: 'time_diff: {$ subtract: [Date() -" $ time "]}' jako część agregacji, a następnie dopasuj przeciwko: 'time_diff: {$ lte:" $ time_diff "}'. – guyarad

2

Wow, dzięki @Alistair_Nelson udało mi się uzyskać dane z n minut temu, na przykład, aby uzyskać ostatnie 18 minut od ISODate ("2013-08-14T14: 00 : 00Z "):

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

Aby dostać tylko pola muszę:

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