2013-04-28 2 views
1

MongoDB를 사용하고 있는데 실수로 두 개의 콜렉션이 생겼습니다. 트윗 수집에서 고유 사용자 30 만 개 레코드두 개의 컬렉션을 동시에 쿼리하는 방법은 무엇입니까?

{ 
"_id" : ObjectId("515af34297c2f607b822a54b"), 
"text" : "bla bla ", 
"id" : NumberLong("314965680476803072"), 
"user" : 
     { 
     "screen_name" : "TheFroooggie", 
     "time_zone" : "Amsterdam", 
     }, 
} 

두 번째 컬렉션 (사용자)과는 다음과 같습니다

첫 번째 컬렉션 (샘플) 다음과 같은 구조 억 개 기록 (트윗)가 사용자 컬렉션에 _id가 트위터 컬렉션에서 user.screen_name는이

{ "_id" : "000000_n", "target" : 1, "value" : { "count" : 5 } } 

은 타겟 상태 (스패머 여부) 최종적 value.count 사용자는 첫 번째로 등장 개수이다 컬렉션 (샘플) 컬렉션 (e .지. 캡처 된 트윗 수) 지금

나는 다음과 같은 쿼리를하고 싶습니다 :

나는 사용자가 목표 값이 (트윗) 샘플 모음에서 모든 문서를 반환하고 싶습니다

= 1

즉, 예를 들어 모든 스팸 발송자의 모든 트윗을 반환하고 싶습니다.

+1

쿼리는 한 번에 하나의 컬렉션에서만 작동 할 수 있습니다. 조인이 없습니다. 조인이있는 것처럼 보일 수있는 프레임 워크가 있지만 실제로는 많은 쿼리가 작성됩니다. StackOverflow에는 많은 질문/답변이 있습니다. – WiredPrairie

+0

귀하의 의견에 대해 WiredPrairie에게 감사드립니다. StackOverflow에서 몇 가지 솔루션 주소를 탐색했지만 많은 수의 레코드를 수용 할만큼 효율적이지 못하거나 필요하지도 않았습니다. '사용자'(두 번째 컬렉션)와 하위 문서로 된 자신의 트윗이 포함 된 세 번째 컬렉션이 실제로있는 것이 맞는지 궁금합니다. 그러나 합리적인 시간에이를 완료하려면 효율적인 구현이 필요하며이 비 관계형 세계의 초보자로서의 도움을 주시면 감사하겠습니다. – amaatouq

+0

사용자 문서에 트윗을 포함시키지 않으려 고합니다. 여기에 두 개의 쿼리를 작성하면 어떤 문제가 발생합니까? 일들이 적절하게 색인되면 합리적으로 빠를 것입니다 (확실히 세 번째 모음을 유지하는 것보다 빠릅니다).하나의 쿼리에서이 작업을 수행하는 것이 중요한 경우 대상 필드를 트윗 콜렉션 사용자 하위 문서로 비정규 화 한 다음 누군가가 "재 분류"되었을 때이를 업데이트하는 배치 작업을 가질 수 있습니다. –

답변

1

트윗을 받으면 컬렉션으로 그들을 업로딩 할 수 있습니다. 작성자 정보를 업데이트의 "쿼리"문서 부분의 키로 사용합니다. 업데이트 문서에서는 $addToSet 연산자를 사용하여 트윗을 트윗 배열에 넣을 수 있습니다. 저자와 트윗 배열을 가진 컬렉션으로 끝날 것입니다. 그런 다음 각 작성자에 대한 스패머 분류를 수행하고 관련 트윗을 가질 수 있습니다.

그래서, 당신은 이런 일을 끝낼 것입니다 :

db.samples.update({"author":"joe"},{$addToSet:{"tweets":{"tweet_id":2}}},{upsert:true}) 

이 방법은 가능성이 높은 단점을 가지고 성장은 이동 디스크에 확장된다는 의미입니다 디스크의 초기에 할당 된 크기 과거 문서 . 색인을 업데이트하는 데 약간의 불이익이 발생할 수 있습니다.

각 짹짹 문서에 스팸 등급을 저장하고 나중에 사용자 ID를 기반으로 스팸 등급을 가져올 수도 있습니다.

다른 사람들도 지적했듯이 적절한 색인을 설정하고 커서를 사용하여 사용자가 자신의 트윗을 가져 오는 것을 반복하는 데는 아무런 문제가 없습니다.

선택한 접근 방식은 의도 한 액세스 패턴을 기반으로해야합니다. 여러 가지 가능한 솔루션을 실험해볼 수있는 좋은 장소에있는 것 같습니다.

+0

Welcome to StackOverflow. 서명이나 사인온은 질문이나 답변에서 권장하지 않습니다. :-) –

+1

이것은 성능면에서 매우 좋지 않은 스키마입니다. 각 사용자 문서는 무제한 적으로 성장할뿐 아니라 트윗의 전체 하위 집합을 대상으로 쿼리해야하는 사람으로부터 최신 트윗을 얻을 수 있습니다. OP가하는 것처럼 두 가지 컬렉션을 갖는 것이 본질적으로 잘못된 것은 아닙니다. 둘 다 (두 개의 쿼리 또는 일부 정보의 비정규 화)에서 정보에 액세스해야하는 쿼리에 대한 전략 만 있으면됩니다. –

관련 문제