2017-12-25 31 views
1

소셜 미디어 활동 계정과 같은 것에 대한 알림 신청을 본 수많은 사용자가 있다고 가정 해 보겠습니다.관계를 사용하지 않고 mongoDB 객체에 여러 항목을 올바르게 "연결"하는 방법은 무엇입니까?

오프라인 상태에서 "놓친"업데이트를 볼 수있는 옵션으로 사용자를 플래시하고 싶습니다.

사용자 모델에 연결된 데이터 개체에 알림의 MongoDB _id을 저장하면 사용자가 모든 채널에 가입하고 몇 메가 바이트의 업데이트가 누락되어 사용자 개체가 매우 커지는 상황이 발생할 것으로 예상됩니다 :

반면, 몽구스에
{ name: 'John' 
    missedNotifications: [ /* 10 million items */ ] 
} 

하지만이 "지원"협회는 종류의 여러 장소에서이 중복 된 데이터를 것 많은-to-many 연관을 제외하고는 같은 문제로 실행됩니다.

알림 개체에 본 적이 있거나없는 사용자 목록이있는 경우 몇 년 후 전체 알림 컬렉션을 검색하는 데 시간이 많이 걸릴 수 있습니다.

누가 모델을 보았고 모델을 제대로 수정했는지 추적하는 세 번째 방법이 있습니까?

답변

1

누락 된 알림을 추적하는 대신 수신 된 마지막 알림을 추적하는 것이 좋습니다.

  • 유닉스 에포크 초를 나타내는 4 바이트 값을
  • 3 바이트 머신 식별자
  • 2 바이트 공정 : MongoDB에의 ObjectId들 설명서에 따라, 다음과 같이 구성된다 id 및
  • 임의 값으로 시작하는 3 바이트 카운터입니다.

때문에이 ID를 구성하는 방법, 당신은 일반적으로 이전 알려진 ID (예를 들어 db.notifications.find({_id: {$gt: last_known_id}})) 다음에 삽입 된 모든 문서를 검색 할 _id 필드에서 $gt 검색을 수행 할 수 있습니다.

이렇게하면 하나의 알림 ID 만 추적하면서 누락 된 모든 새 알림을 검색 할 수 있습니다. 여러 알림 유형을 추적해야하고 알림 추적에서 세분화가 필요하다면 각 유형에 대해 마지막으로 본 문서 ID를 추적하면됩니다.

+0

조금 날아갔습니다. $ gt는 ID를 어떻게 분석합니까? –

+0

MongoDB가 ObjectId 비교를 처리하는 방법에 대한 실제 내부 정보가 확실하지 않지만 16 진수 값은 순서를 결정합니다. id의 처음 4 바이트는 타임 스탬프를 나타냅니다. 즉, 최소한 ID는 타임 스탬프에 따라 초 단위의 정밀도로 정렬됩니다. 다음 5 바이트는 애플리케이션을 수평으로 확장하지 않으면 큰 관심사가 아닙니다. 상대적으로 일정하게 유지됩니다. 마지막 3 바이트는 카운터이며 동일한 초에 삽입 된 문서가 올바르게 정렬되도록합니다. –