2011-08-21 2 views
0

예 제목이 길기도하지만 그 나는 간결하게 문제를 설명 할 수있는 간단한 방법 :mongodb에서 임베디드 된 문서가 하나 있지만 다른 문서는없는 문서를 선택하는 방법은 무엇입니까?

{ "_id" : ObjectId("4e5044ecf9d7954533000002"), "events" : [ 
     { 
       "state" : 1, 
       "time" : 1313882989, 
     }, 
     { 
       "time" : 1313883005, 
       "state" : 0, 
     } 
]} 

당신은 "이벤트"는 인 것을 알 수 있습니다 :

를 내가 이렇게 보이는 문서가 임베디드 된 문서의 배열. 상태 : 1은 해당 시간 (UTC의 초)에 문서가 "활성"으로 설정되었음을 의미하고 상태 : 0은 해당 시간에 "비활성"으로 설정되었음을 의미합니다. 이것은 본질적으로이 문서가 활성화 된 시간 범위를 제공합니다 (1313882989에서 1313883005까지)

1313883013과 같이 특정 시간에 어떤 문서가 활성화되었는지 확인하려고 할 때 활성 상태와 비활성 상태 사이의 시간 이벤트.

나는이 쿼리 뭔가 얻을 수 있습니다 : 그것은 내가 확인해야하기 때문에 상태 = 1 AND 시간이 < 1313883013.이, 그러나 충분하지 않습니다 완전한 포함 된 문서를 일치

db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}}}}) 

문서가 도에 비활성 이벤트를 포함하지 않거나 1313883013. 전에 그래서 나는이 시도했다 :

db.plays.find({events:{$elemMatch:{state:1,time:{$lte:1313883013}},$not:{$elemMatch:{state:0,time:{$lte:1313883013}}}}}) 

을하지만 아무 소용. 그리고 나는 그것의 다른 변형을 시도했습니다.

나는 어떤 도움을 주셔서 감사합니다.

+0

이벤트가 여러 개의 0/1 전환을 가질 수 있습니까? 아니면 주에 허용되는 세 가지 옵션으로 [1] 또는 [1, 0] 중 하나라고 말하고 있습니까? –

+0

상태는 기본적으로 "비트 플래그"0 또는 1이며 다른 옵션은 없습니다. – talentedmrjones

답변

0

하나의 쉬운 옵션은 미래에 무한히 멀리 시간을 정의하고 활성 문서를 종료 시간으로 설정하는 것입니다. 모든 이벤트를 {start:12345, end:999999999} 양식으로 만들면 start < time < end의 간단한 테스트가됩니다. 문서가 더 이상 사용되지 않으면 최대 종료 시간을 가진 이벤트를 찾아 현재 시간으로 변경합니다 (간단한 업데이트).

+0

루트 문서에 시작 및 종료 키가 있다고 말하는 것입니까? 아니면 각각의 임베디드 문서? (다만 명확하지 않은 경우 임베디드 문서는 동작 기록을 보여주기 때문에이를 지켜야합니다.) – talentedmrjones

관련 문제