복붙노트

[MONGODB] 모델에 어떻게 MongoDB를 가진 투표 시스템을 "좋아"

MONGODB

모델에 어떻게 MongoDB를 가진 투표 시스템을 "좋아"

현재 내가 모바일 앱에서 일하고 있습니다. 기본적으로 사람들은 사진을 게시 할 수 있으며 추종자들은 인스 타 그램과 같은 사진을 좋아 할 수 있습니다. 나는 데이터베이스와 MongoDB를 사용합니다. 인스 타 그램과 마찬가지로, 하나의 사진을 좋아하는 많은있을 수 있습니다. 이 메모리를 많이 낭비하기 때문에 "와 같은"하나의 문서를 사용 그래서 인덱스 합리적인없는 것 같다. 그러나, 나는 빨리 같은 추가 사용자 싶습니다. 내 질문은 그래서는 어떻게 "와 같은"모델인가? 기본적으로 데이터 모델은 많은 인스 타 그램과 유사하지만, MongoDB를 사용하고 있습니다.

해결법

  1. ==============================

    1.아무리 당신이 전체 문서를 구조화하는 방법 기본적으로 당신이 필요로하는 두 가지가 없다. 기본적으로 "계산"이미 게시 한 사람들의 "목록"에 대한 속성입니다 그들의 보장하기 위해 제출에는 중복이 없다 "와 같은". 다음은 기본 구조는 다음과 같습니다

    아무리 당신이 전체 문서를 구조화하는 방법 기본적으로 당신이 필요로하는 두 가지가 없다. 기본적으로 "계산"이미 게시 한 사람들의 "목록"에 대한 속성입니다 그들의 보장하기 위해 제출에는 중복이 없다 "와 같은". 다음은 기본 구조는 다음과 같습니다

    { 
        "_id": ObjectId("54bb201aa3a0f26f885be2a3")
        "photo": "imagename.png",
        "likeCount": 0
        "likes": []
    }
    

    어떤 경우, 거기 "사진 포스트"와 어떤 정보를 당신이 원하는에 대해 고유 한 "_id"입니다,하지만 다른 필드가 언급 한 바와 같이. 여기에 속성을 "좋아"배열하고, 그 고유의 시스템에서 "사용자"객체에서 값을 "_id"개최 할 예정이다. 모든 "사용자"그래서, 중 로컬 스토리지 또는 오픈 ID 또는 뭔가하지만, 고유 식별자에 고유 한 식별자 곳이 있습니다. 나는 예를 들어 ObjectId가 함께 붙어 있습니다.

    누군가가 "와 같은"게시물에, 당신은 다음 업데이트 문을 실행하려면 제출하면 :

    db.photos.update(
        { 
            "_id": ObjectId("54bb201aa3a0f26f885be2a3"), 
            "likes": { "$ne": ObjectId("54bb2244a3a0f26f885be2a4") }
        },
        {
            "$inc": { "likeCount": 1 },
            "$push": { "likes": ObjectId("54bb2244a3a0f26f885be2a4") }
        }
    )
    

    지금은 $ INC 동작하므로 $ 누름 조작이 미래 참조 문서의 배열에 사용자에 대한 고유 식별자를 추가 1 씩 증가 지정된 숫자 "likeCount"의 값이 증가 할 것이다.

    여기에 주요 중요한 것은 투표 및 명령문의 "쿼리"부분에서 무슨 일이 일어나고 있는지 그 사용자의 기록을 유지하는 것입니다. 그 외에도 자신의 독특한 "_id"는의에 의해 업데이트 할 문서를 선택에서, 다른 중요한 점은 확실히 현재 투표 사용자가 이미 거기에 있지 않은지 확인하기 위해 배열을 "좋아"확인하는 것입니다.

    동일은 "좋아요" "제거"반대의 경우 나 마찬가지입니다 :

    db.photos.update(
        { 
            "_id": ObjectId("54bb201aa3a0f26f885be2a3"), 
            "likes": ObjectId("54bb2244a3a0f26f885be2a4")
        },
        {
            "$inc": { "likeCount": -1 },
            "$pull": { "likes": ObjectId("54bb2244a3a0f26f885be2a4") }
        }
    )
    

    여기에 주요 중요한 것은 쿼리 조건이 모든 조건이 충족되지 않을 경우에는 문서를 건드리지되어 있는지 확인하는 데 사용되는 것입니다. 사용자가 이미 투표 또는 감소했다면 자신의 투표 업데이트시 더 이상 실제로 존재하지 있다면 그래서 수는 증가하지 않습니다.

    물론 당신의 응용 프로그램의 다른 부분에서 문서 뒤에 백 개 항목의 부부와 함께 배열을 읽을 실용적이지 않습니다. 그러나 MongoDB를 그 처리뿐만 아니라 아주 표준적인 방법이있다 :

    db.photos.find(
        { 
            "_id": ObjectId("54bb201aa3a0f26f885be2a3"), 
        },
        { 
           "photo": 1
           "likeCount": 1,
           "likes": { 
              "$elemMatch": { "$eq": ObjectId("54bb2244a3a0f26f885be2a4") }
           }
        }
    )
    

    그렇지 않은 곳들이 존재하거나 빈 배열 경우 투영 $ elemMatch이 사용은 현재 사용자를 반환합니다. 이것은 현재 사용자가 이미 투표를 배치하거나하지 않은 경우 애플리케이션 로직의 나머지 부분은 인식 할 수 있습니다.

    즉, 기본 기술과 같이 당신을 위해 작동 할 수 있지만 당신은 내장 된 배열은 무한히 확장 할 수 없습니다 것을 알고 있어야하고, BSON 문서에 하드 16 메가 바이트 한계도있다. 그래서 개념은 소리, 그러나 당신이 당신의 내용에 "투표처럼"1000 개의를 기대하는 경우 자신의 사용할 수 없습니다. "좋아"의 대용량 저장에 대한 한 가지 해결책을 허용 하이브리드 스키마 디자인이 예에서 일부 상세히 설명 "버킷"이라고하는 개념이있다. 그 볼륨에서이 작업을 수행하는 방법으로 여기에 기본 개념과 함께 사용하기에 당신은 볼 수 있습니다.

  2. from https://stackoverflow.com/questions/28006521/how-to-model-a-likes-voting-system-with-mongodb by cc-by-sa and MIT license