2011-02-12 5 views
18

의 모든 고유 태그의 목록을 가져옵니다이 다음과 같은내가 MongoDB를 시작으로하고 MongoDB를

{ 
    "type": 1, 
    "tags": ["tag1", "tag2", "tag3"] 
} 
{ 
    "type": 2, 
    "tags": ["tag2", "tag3"] 
} 
{ 
    "type": 3, 
    "tags": ["tag1", "tag3"] 
} 
{ 
    "type": 1, 
    "tags": ["tag1", "tag4"] 
} 

과 같이 문서의 컬렉션이, 나는 는 모든 태그의을 설정하려면 특정 유형. 예를 들어, 유형 1의 경우 tag1, tag2, tag3, tag4 (임의의 순서) 집합이 필요합니다.

내가 생각할 수있는 것은 태그를 가져 와서 파이썬에서 set에 추가하는 것입니다.하지만 mongodb의 mapreduce 또는 다른 방법으로 태그를 사용하는 방법이 있는지 알고 싶었습니다. 제발 조언.

답변

41

태그의 고유 한 목록 만 원하면 distinct를 사용하는 것이 가장 좋습니다. Map/Reduce는 느려지고 자바 스크립트 부분에 인덱스를 사용할 수 없습니다.

http://docs.mongodb.org/manual/reference/method/db.collection.distinct/

db.coll.distinct("tags", {type:1}) 유형 = 1 태그 집합을 반환합니다.

+0

멋진 남자! 너는 내 하루를 만들어 줬어 :) 고마워. –

3

맞습니다. Map/Reduce가 수행하려는 작업에 적합하지만 Set이 더 빠르고 적은 코드 일 수 있습니다.

> m =  function() { 
...   for (var tag in this.tags) { 
...    emit(this.tags[tag], 1); 
...   } 
...  } 

> r =  function(key, values) { 
...   return 1; 
...  } 

> db.tags.mapReduce(m, r).find() 
{ "_id" : "tag1", "value" : 1 } 
{ "_id" : "tag2", "value" : 1 } 
{ "_id" : "tag3", "value" : 1 } 
+0

이 작업을 수행 한 후에도 필자는 필요한 방식으로 태그 목록을 얻기 위해'set' 메소드를 사용해야 할 것입니다. 그렇다면 왜 map-reduce 단계를 사용합니까? '.find ({}, {tags : 1}) '를 실행하고 태그를 조작하는 것이 ... –

+0

태그를 어떻게 반환해야합니까? 당신은 당신의 질문에 그것을 명시하지 않았습니다. –

+0

죄송 합니다만, 분명히 생각한 것 같아서 ... 기본적으로 반복 가능한 목록 또는 집합 (기본적으로 반복 가능), 반복 없음, 즉 고유 한 값만 사용하십시오. –