2016-07-13 4 views
1

MongoDb에 매우 익숙하며 시계열 데이터를 저장하는 데 사용할 수 있는지 실험하고 있습니다. I는 다음과 같은 데이터를 삽입Robomongo를 사용하여 dateTimes 사이에 중첩 배열을 검색하는 MongoDb

...

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

따라서 1 개 초 간격에서 날짜 시간을 길게 배열 판독 각 문서. 나는 두 날짜 시간 사이에 조회 할 경우

그래서, 나는

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

그러나 이것은 항상 반환 ...하여 Robomongo 쿼리 창에 다음과 같은 노력하고 실제로 그들 모두를 반환해야합니다으로 Fetched 0 record(s) in 11ms.

내 구문이 틀리지 만 여기에있는 것과 같이 잘못된 구문과 중첩 배열에서 datetimes를 검색하는 방법을 찾을 수 없습니다. 누구든지 아이디어가 있습니까?

미리 감사드립니다.

답변

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

대단히 감사합니다. 완벽하게 작동합니다! 나는이 문법을 공부할 것이고 이것은 어떤 문서에서 내가 생각한 방식과는 완전히 다른 것이다. – peterc

+0

사실, 나는 총을 여기에 뛰어 올렸을 것 같습니다. 위의 내용은 필터의 바깥에있는 판독 값을 포함하여 시간 내에 판독 값이있는 모든 문서를 반환합니다. 첫 번째 및 마지막 문서가 해당 기간 내에 포함 된 판독 값을 갖도록하는 방법이 있기를 바랬습니다. 이것이 "수동으로"할 때 가능할 수 있습니까? – peterc

+0

업데이트 된 답변을보십시오. 필드의 날짜 만 변경하십시오. –