2011-01-06 6 views
4

MongoDB에 저장된 블로그 게시물에서 관련 태그 목록을 가져 오는 방법을 알아 내려고하고 있습니다.MongoDB에 저장된 블로그 게시물에 대한 관련 태그를 나열하십시오.

데이터 구조는

{ 
    title: "Post #1", 
    tags: { "news", "politics" } 
}, 
{ 
    title: "Post #2", 
    tags: { "news", "entertainment" } 
}, 
{ 
    title: "Post #3", 
    tags: { "entertainment", "music", "theatre" } 
}, 
{ 
    title: "Post #4", 
    tags: { "entertainment", "music", "concerts" } 
} 

원하는 결과

나는 "엔터테인먼트"에 관련된 태그의 목록을 얻고 싶은 경우에, 그것은 유사한 태그를 찾기 위해 게시물을 조회합니다. 비슷한 태그는 게시물에 "엔터테인먼트"라는 태그가 붙은 경우에도 사용됩니다.

Tag  Count 
======== ====== 
music  2 (because there are 2 posts tagged with music + entertainment) 
concert 1 
theatre 1 
news  1 

가능한 것과 그것을 가까이 얻을 수있는 방법이 있나요 :

나는 다음과 같은 결과를 얻을 수 있도록하고 싶습니다? 내가 얻을 수 있었던 가장 가까운 것은 db.posts.find({tags: "entertainment"});을 사용하고 MongoDb 외부에서 그 값들을 반복하고 구성하는 것입니다. 더 효율적인 방법을 찾고 있습니다.

답변

1

빠른 읽기를 유지하려면 작업을 쓰기면으로 밀 수 있습니다. 이미 some_list_of_tags의 게시물에 new_tag을 추가하려고한다고 가정 해 보겠습니다. 다음 코드는 원하는 값으로 컬렉션을 만들 것입니다 :

다음
for old_tag in some_list_of_tags: 
    db.related_tags.update({'_id':new_tag}, {'$inc':{'counts.'+old_tag:1}}, upsert=True) 
    db.related_tags.update({'_id':old_tag}, {'$inc':{'counts.'+new_tag:1}}, upsert=True) 

엔터테인먼트 '에 대한 결과를 얻으려면, 단지 수행

db.related_tags.find({'_id': 'entertainment'}) 

당신은에 태그를 추가 원자에 findAndModify 명령을 사용할 수 있습니다 게시물을 올리고 기존의 모든 태그를 가져 오십시오.

old_tags = db.posts.findAndModify({query: {_id: ID}, 
            update: {$addToSet: {tags: new_tag}}, 
            fields: {tags: 1} 
            })['tags'] 
+0

나는 그 옵션을 생각하지 않았습니다. 좋은 생각. – Trevor

0

찾을 수 없습니다. MongoDB는 매우 제한적인 (그러나 매우 효율적인) 쿼리 기능을 가지고 있습니다. 맵/리덕션이 필요하지만 MongoDB M/R은 오늘 싱글 스레드이며 JS 엔진이 가장 좋은 솔루션이 될 수있는 가장 빠른 방법은 아닙니다.

관련 문제