2013-04-22 3 views
22

의 내가 컬렉션의 다음 문서가 있다고 가정 해 봅시다 : 결과의MongoDB : 하위 문서 필드 값의 고유 목록을 얻는 방법은 무엇입니까?

[ "John", "Anna", "Kevin" ] 

구조가 다를 수 있습니다 :

{ 
    "family": "Smith", 
    "children": [ 
     { 
      "child_name": "John" 
     }, 
     { 
      "child_name": "Anna" 
     }, 
    ] 
} 

{ 
    "family": "Williams", 
    "children": [ 
     { 
      "child_name": "Anna" 
     }, 
     { 
      "child_name": "Kevin" 
     }, 
    ] 
} 

는 지금은 모든 가족을 건너 어떻게 든 독특한 아이 이름의 다음 목록을 얻으려면. MongoDB에서이를 달성하는 방법은 무엇입니까? 뭔가 간단해야하지만 알아낼 수 없습니다. 컬렉션에 대해 aggregate() 함수를 시도했지만 distinct() 함수를 적용하는 방법을 알지 못합니다.

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}]) 

또는 더 많은 관심) 이름의 주파수 : 도움말 집계 프레임 워크

+0

http://docs.mongodb.org/manual/core/map-reduce/ –

답변

46

당신은 다만 할 수 있습니다 귀하의 경우

db.collection.distinct("children.child_name"); 

그 반환 :

[ "John", "Anna", "Kevin" ] 
+2

젠장, 너무 쉬워! 나는 머리를 부 .다. 고마워요.이게 가장 짧은 일하는 대답인데, 제가 원하는 것을 정확하게 전 해주고 있습니다. – vladimir

+2

괜찮지 만 - 샤딩 클러스터의 성능은 어떻습니까? distinct는 각 rs 인스턴스에서 처리 될 것입니다. 예를 들어 –

+1

분명히 나는 ​​아직 성능을 생각하고 있지 않습니다. 그러나 이것은 중요한 것입니다, 감사합니다. – vladimir

5

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}]) 
+0

하지만 그는 그가 요구 한 것이 아닙니다. 그는 각각의 이름과 개수로 하위 문서가 아닌 고유 한 이름 배열을 원합니다 ... –

+0

나는 그것을 읽습니다. : > "결과의 구조가 다를 수 있습니다." 예 !, 다른 구조입니다.) –

+0

예, 감사합니다. 그것은 작동하고, 내가 aggregate()에 대해 더 많이 배울 것을 강요합니다. – vladimir

관련 문제