2016-07-13 1 views
1

Je suis très nouveau à MongoDb et expérimenter pour voir si je peux l'utiliser pour stocker des données de série chronologique.MongoDb recherche tableau imbriqué entre dateTimes en utilisant Robomongo

J'ai inséré les données suivantes ...

{ 
"_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" 
    }, 
    .... 

Ainsi, chaque document que les lectures du tableau qui détiennent DateTimes dans 1 seconde.

Donc, si je veux interroger entre 2 datetimes, je suis en train ce qui suit dans la fenêtre de requête Robomongo ...

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

Cependant cela retourne toujours Fetched 0 record(s) in 11ms où car il leur doit retourner en fait tout.

Ma syntaxe doit être incorrecte, mais je ne trouve tout simplement pas ce qui ne va pas et comment rechercher des dates dans un tableau imbriqué comme je l'ai ici. Quelqu'un aurait-il des idées?

Merci d'avance!

Répondre

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

Merci beaucoup, fonctionne parfaitement! Je vais étudier cette syntaxe, qui est assez différente de ce que je pensais avoir vu dans certains documents. – peterc

+0

En fait, je pense que j'ai peut-être sauté le pistolet ici. Ce qui précède renvoie tous les documents qui ont des lectures dans la période de temps, y compris les lectures qui tombent en dehors du filtre. Espérait qu'il y avait un moyen d'avoir aussi le premier et le dernier document juste avoir les lectures incluses dans le délai. Serait-ce possible en faisant "manuellement"? – peterc

+0

Regardez la réponse mise à jour. Changez simplement les dates dans les champs. –