2010-06-07 6 views
1

정기적으로 리소스를 폴링하고 데이터베이스에 저장된 응답을 가져 오는 스크립트와 함께 작동하는 MongoDB 데이터베이스를 디자인하고 있습니다. 현재 데이터베이스에는 id, 이름, 타임 스탬프데이터의 네 개의 필드가 포함 된 컬렉션이 하나 있습니다.MongoDB 데이터베이스의 변경 내용을 검색합니다.

스크립트 실행 사이의 데이터 필드에 어떤 이름이 변경되었는지를 확인할 수 있어야합니다. 의사에서 ,

if(data[name][timestamp]==data[name][timestamp+1]) //data has not changed 
store data in collection 1 
else //data has changed between script runs for this name 
store data in collection 2 

는 반복하고 컬렉션의 각 항목을 통해 자바 스크립트를 실행하지 않고이 작업을 수행 할 수있는 쿼리가 있습니까? 수백만 개의 문서가 있으므로 매우 느립니다.

스크립트가 실행될 때마다 타임 스탬프이라는 새 컬렉션을 만들어야합니까? 그것은 더 빨리/더 조직화 될까요? 사용할 수있는 더 나은 스키마가 있습니까?

스크립트는 하루에 한 번 실행되므로 언제든지 네임 스페이스 제한이 적용되지 않습니다.

답변

1

좋아요, 이건 간결한 질문입니다/간결 기본적으로 : 당신은 각 항목 이상의 자바 스크립트를 반복하고 실행해야합니다.

"깔끔한"부분은 SQL 솔루션이 수행해야하는 것과 실제로 다르지 않다는 것입니다. 내 말은, 당신은 기본적으로 테이블 자체에 가입하고 있습니다. x.1=x.1y.1=y.2입니다. 비록 관계형 DB가 그러한 짐승을 다룰 수 있다고하더라도, 그것은 수백만 항목으로 빠르지 않을 것입니다.

사실,이 올바른 방법을 사용하고 있습니다. 다음은이 클리너를 만드는 데 사용할 추가 정보입니다.

  1. 이름/시간 소인에 색인이 있어야합니다.
  2. 데이터 세트에서 db.mycollection.find().foreach()을 실행하십시오.
  3. 앞으로가는 입구는 입니다. 비교를 수행하십시오. b) 적절하게 저장하십시오. c)이 레코드가 처리되었음을 나타내는 플래그를 업데이트합니다.
  4. 나중에로드 할 때 찾기에 쿼리를 추가 할 수 있어야합니다. db.mycollection.find({flag:{$exists:false}}).foreach()
  5. 속도를 높이려면 db.eval()을 사용하십시오.

"이름/시간 소인"색인의 이유는 "이름/시간 소인"으로 각각의 "후임자"를 조회 할 것이기 때문에 여기에서 빠르게하고 싶습니다.

"처리 된"플래그의 이유는 동일한 항목을 다시 실행할 필요가 없다는 것입니다. 주어진 타임 스탬프 'n'을 찾으면 'n + 1'을 찾은 다음 그 'n + 1'만이 나타납니다.

정직하게 말하지만, 하루에 한 번만 실행하는 경우 속도가 좋을 것 같습니다. 특히 새로운 레코드 만 실행하는 경우에는 더욱 그렇습니다. 몇 분이 걸릴 것으로 가정합니다.

관련 문제