2016-07-13 18 views
1

Ich bin sehr neu zu MongoDb und experimentieren, um zu sehen, ob ich es verwenden kann, um Zeitreihen Daten zu speichern.MongoDb Suche verschachtelten Array zwischen dateTimes mit Robomongo

I folgende Daten eingefügt haben ...

{ 
"_id" : ObjectId("5785f186ed936527c05efa10"), 
"Timestamp" : ISODate("2006-07-13T07:42:00.000Z"), 
"Label1" : "Lab1", 
"Attr" : "atrr1", 
"Readings" : [ 
    { 
     "DateTime" : ISODate("2006-07-13T07:42:06.355Z"), 
     "Value" : "22" 
    }, 
    { 
     "DateTime" : ISODate("2006-07-13T07:42:07.355Z"), 
     "Value" : "22" 
    }, 
    { 
     "DateTime" : ISODate("2006-07-13T07:42:08.355Z"), 
     "Value" : "22" 
    }, 
    .... 

So jedes Dokument als die Array-Messwerte, die in Datetime Intervallen von 1 Sekunde halten.

Also, wenn ich zwischen zwei Datetimes abfragen wollen, versuche ich, die folgenden in der Robomongo Abfragefenster ...

db.getCollection('Timedata').find(
{ 
'Readings.DateTime':  
    { $gt: '2005-07-13 07:42:13.355Z', $lt: '2010-07-13 07:42:13.355Z'}   
    }) 

Doch dies immer wieder Fetched 0 record(s) in 11ms wo, wie es eigentlich sie alle zurückkehren.

Meine Syntax muss falsch sein, aber ich kann einfach nicht finden, was falsch ist und wie in einem geschachtelten Array nach Datumsangaben gesucht wird, wie ich hier habe. Hätte jemand Ideen?

Vielen Dank im Voraus!

Antwort

1
db.getCollection('Timedata').find(
{ 
Readings: { 
    $elemMatch: 
    {DateTime: 
     { 
      $gt: ISODate('2005-07-13 07:42:13.355Z'), 
      $lt: ISODate('2010-07-13 07:42:13.355Z') 
     } 
    } 
    } 
}); 


db.getCollection('Timedata').aggregate([ 
    { 
     $match:{ 
     Readings: { 
      $elemMatch: 
      {DateTime: 
       { 
        $gt: ISODate('2005-07-13 07:42:13.355Z'), 
        $lt: ISODate('2010-07-13 07:42:13.355Z') 
       } 
      } 
      } 
     } 
    }, 
    { 
     $project: { 
     _id:1, 
     Timestamp:1, 
     Label1:1, 
     Attr:1, 
     Readings: { 
      $filter: { 
       input: "$Readings", 
       as: "item", 
       cond: { 
        $and: [ 
         {$gt: [ "$$item.DateTime", ISODate('2006-07-13 07:00:13.355Z') ]}, 
         {$lt: ["$$item.DateTime", ISODate('2010-07-15 07:42:13.355Z')]} 
        ] 
       } 
      } 
     } 
     } 
    } 
]) 
+1

Vielen Dank, funktioniert perfekt! Ich werde diese Syntax studieren, die ganz anders ist als die, die ich in einigen Dokumenten gesehen habe. – peterc

+0

Eigentlich glaube ich, dass ich hier die Waffe gesprungen bin. Die obige Ausgabe gibt die gesamten Dokumente zurück, die innerhalb des Zeitraums Messwerte enthalten, einschließlich Messwerte, die außerhalb des Filters liegen. Ich hatte gehofft, dass es einen Weg gab, das erste und das letzte Dokument zu haben, damit die Messwerte innerhalb des Zeitraums enthalten sind. Wäre das mit "manuell" möglich? – peterc

+0

Sehen Sie sich die aktualisierte Antwort an. Ändern Sie einfach die Daten in den Feldern. –

Verwandte Themen