2012-08-28 3 views
1

배경 : 나는 모두 HABTM 커뮤니티 인 게시물과 사용자가 있습니다.가상 속성 별 Mongoid Query DB

def relevance(user) 
    (self.communities & user.communities).length 
end 

목적 : 조회하는 게시물 중 주어진 관련성 즉 내 포스트 모델에서, 나는 그들이 같은 공통점이 얼마나 많은 지역을 비교하여 특정 사용자에게 게시물의 관련성을 계산하는 방법을

Post.where(:relevance => 3) 

또는

는 모든 게시물을 조회하고

Post.all.desc(:relevance) 
즉 관련성별로 정렬하기

사용자 변수가 어딘가에 필요하다는 것을 알고 있습니다.이 같은 것이 가능한지 또는 해결 방법이 있는지 궁금합니다.

+0

직접 그렇게 할 수 없게 될까봐 걱정됩니다. 그러나 맵/축소 처리를 사용할 수 있습니다. – apneadiving

+0

조금 확장 할 수 있습니까? 나는 당신이 성취하려는 것을 정확히 모릅니다. 관련성은 어디에 계산되며 문서에 이미 존재합니까? – Sammaye

+0

관련성은 각 사용자마다 다르므로 post.rb의 메소드로 계산됩니다 (위의 코드 참조). 즉석에서 계산해야합니다. – neon

답변

0

Aggregation Framework (버전 2.2의 새로운 기능)을 사용하여 mongoDB에서이 작업을 수행 할 수 있습니다.

사용할 수있는 사용자 커뮤니티의 배열이 있어야합니다. 이 예제에서는 userComms라고 부르겠다. post.com 커뮤니티와 동일한 유형의 값을 가진 배열이 될 것으로 기대한다.

db.posts.aggregate([ 
    { 
     "$unwind" : "$communities" 
    }, 
    { 
     "$match" : { 
      "communities" : { 
       "$in" : userComms 
      } 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$_id", 
      "relevance" : { 
       "$sum" : 1 
      } 
     } 
    }, 
    { 
     "$sort" : { 
      "relevance" : -1 
     } 
    } 
]); 

이것은 형식의 문서를 반환 그들은 사용자와 공통으로 가지고 지역 사회의 수를 추가하여 산출 된

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "relevance" : 4 
     }, 
     { 
      "_id" : 6, 
      "relevance" : 3 
     }, 
... 
     ] 
} 

결과 배열은 게시물의 _ids과 관련이 포함되어 있습니다. 그런 다음 그 합계로 내림차순으로 내림차순으로 정렬됩니다.

+0

방금 ​​Mongo로 시작한 저는 Mongoid를 사용하여 이것을 구현하는 방법을 찾고있었습니다. 아직 가능하지는 않지만. 어떤 충고가 필요 : 몽고이와 함께? – neon

+0

집계 프레임 워크 파이프 라인을 실행하기 위해 db.runCommand ({aggregate : "collectionname", pipeline : [...]})를 사용할 수 있습니다. –

+0

감사합니다.이 접근법과 관련된 문제는 게시물의 관련성이 다릅니다. 각 사용자. 즉, 계산하려면 current_user 오브젝트가 필요합니다. 이것이 어떻게 행해질 수 있는지에 대한 생각? – neon