2017-10-29 1 views
0

특정 날짜의 채팅에서 특정 사용자의 메시지 수를 저장하려는 상황이 있습니다. 이 ~ 내가 함께이 ID를 결합해야한다고 생각하며되었다 이드를 고유하게 20 자 길이는 ChatId + DDMMYY + UserId복잡한 MongoDb 문서 ID를 정의하는 방법은 무엇입니까?

public class UserContributions 
{ 
    [BsonId] 
    public string ChatIdDateUserId { get; set; } 
    public int Count { get; set; } 
    // the rest 
} 

구성하지만이 길이를 가진 ID는 성능에 대한 좋지 않은 것 같아요. 내가 복잡한 ID를 어떻게 만들어야 하느냐?

감사합니다.

답변

1

길이가 너무 길어서는 안됩니다. 또한, 먼저 화합물 _id

{ 
    _id:{ 
    ChatID: "someId", 
    Date: ISODate("2017-10-30T00:00:00.000Z"), 
    UserID: "someUID" 
    } 
} 

에게 몇 가지 메모를 할 수 있습니다 : 날짜를 표시하기 위해 하지 사용 문자열을 마십시오. 우선, ISODate는 64 비트 부호없는 정수로 저장됩니다. 6 자로 저장된 날짜가있는 동안 공간을 절약 할 수 있지만 date operations in aggregationsnormal date comparisons의 모든 기능이 느슨합니다. 불량 아이디어.

두 번째로, 모델이 충돌하기 쉽습니다. 같은 날짜에 같은 사용자가 특정 채팅에 하나의 메시지 만 게시 할 수 있습니다. 오늘의 두 번째 메시지는 이 정확히 일 것이므로 고유성의 제약 조건을 위반하게됩니다. 따라서 실제 ISODate를 밀리 초 단위로 사용해야합니다. 그리고 여전히 충돌 가능성이 적습니다 (두 응용 프로그램 서버에서 생성 된 날짜가 약간 시간당 현명한 경우). 이유는 there is an additional counter in ObjectId입니다. 여기

내가 그것을

{ 
    _id: new ObjectId(), 
    ChatId: "someChat", 
    UserId: "someUser" 
} 

이유를 모델링 할 방법은 다음과 같습니다 ObjectId가 당신이 조회 할 수있는 타임 스탬프를 (내가 그러므로 나는이 위키 것, 예를 들어 줄만큼 충분히 C 번호를 모르는 포함 다른 사람들에게 그렇게 할 수있는 기회를주기 위해 답) 불필요한 복잡성을 제거하고 ChatIdUserId에 대한 색인으로 충분히 빠릅니다.

+0

@Markus에게 감사드립니다. (특정 날짜에 한 명의 사용자에 대해 단 하나의 메시지 만 있어야합니다.이 문서에는 특정 날짜에 대한 카운터 및 기타 활동 정보가 포함되어 있습니다.) – Blendester

+0

@Blendster : 이것은 집계 작업과 비슷하게 들립니다. –

관련 문제