2013-05-26 4 views
3

나는 많은 다음과 같은 구조의 문서가 :중첩 된 개체를 찾을 수 MongoDB를

{ 
    _id: ObjectId("519af935c1a9f8094f0002aa"), 
    messages: [{ 
      message: "Message A", 
      timestamp: 1369130219638 
     }, 
     { 
      message: "Message B", 
      timestamp: 1369130249638 
     }, 
     { 
      message: "Message C", 
      timestamp: 1369130291638 
     } 
    ] 
} 

을 ... 내가 마지막 메시지가 1 시간 이상 전에 게시 한 모든 문서를 조회하는 방법을 모르겠어요. 다음과 같음 : get all documents where timestamp < now() - 3600 여기서 now()은 현재 시간 소인입니다.

아이디어가 있으십니까?

답변

3

문서 쿼리

MongoDB의 쿼리는 타임 스탬프 메시지를 포함하는 문서를 반환합니다.

위의 쿼리는 모든 문서는 기준에 일치하는 반환 그러나이 포함됩니다 : 당신은 당신이 날짜/시간 쿼리와 일치 해달라고 각 문서에있는 모든 메시지를 제거 할 필요가 이제

var tofilter = Messages.find({"messages.timestamp":{$lt:new Date().getTime()-3600*1000}}); 

을 수행 할 수 있습니다 그 중 하나가 기준과 일치하는 한 각 메시지의 모든 메시지는 타임 스탬프와 상관없이

필터 메시지

var results = tofilter.map(function(doc) { 
       var messages = doc.messages; 
       return _.filter(messages, function(message) { 
        return (message.timestamp < new Date().getTime()-3600*1000) 
       }); 
      }); 

는 이제 results 날짜/시간 쿼리와 일치하는 메시지 만 포함, 모든 MongoDB의 문서를 포함

* 참고new Date.getTime() 반환 JS 형식의 타임 스탬프 이는 밀리 초 단위로 표시되므로 ms 단위로 1 시간을 얻으려면 3600에 1000을 곱해야합니다.

관련 문제