2014-09-16 2 views
0

컬렉션 :하위 모음 안에있는 입력란을 찾고 그룹화하는 방법은 무엇입니까?

[{ 
    _id: "Jon" 
    gender: "male", 
    sockets: [ 
     { code: 12345, type: 'default' }, 
     { code: 67891, type: 'special' } 
    ] 
}, 
{ 
    _id: "Jane" 
    gender: "female", 
    sockets: [ 
     { code: 445566, type: 'very_special' }, 
     { code: 223388, type: 'extra_special' } 
    ] 
}] 

나는 코드 필드에 대한 검색을 실행합니다. 따라서 사용자는 코드 입력을 시작하고 발견 된 코드로 제안해야합니다. 예 : 입력 1 결과

[{ 
    _id: "Jon", code: 12345 
}, { 
    _id: "Jon", code: 67891 
}] 

을해야 할 때 나는 그룹과 집계를 사용해야합니다 알고 있습니다. 그러나 필자는 유스 케이스를 위해 이것을 어떻게하는지 예제를 찾을 수 없다. 표준 필드로 그룹화하면이 필드를 사용합니다. 하지만 소켓과 같은 하위 컬렉션에는 적용되지 않습니다.

collection.aggregate([{ 
    $group: { 
     _id: "$code" 
    } 
}]); 

아이디어가 있습니까?

답변

1

집계 프레임 워크에서 "배열"을 처리 할 때 일반적으로 $unwind이 먼저 필요합니다. 이렇게하면 각 배열 항목에 대해 문서를 별도의 문서로 효과적으로 "정규화"할 수 있습니다.

"그룹화"유형의 다른 점은 _id에 단일 필드 값이 아닌 "그룹화"필드 조합을 포함 할 수 있다는 것입니다. 아마도 더 바로이 예에서 여기 $unwind를 처리에서 차이가 있지만, $group의 응용 프로그램에 대한이 같은 그것을 할 수 없습니다 :

db.collection.aggregate([ 
    { "$unwind": "$sockets" }, 
    { "$group": { 
     "_id": { "_id": "$_id", "code": "$sockets.code" } 
    }} 
]) 

는 일반적으로 당신이 실제로 정말에 "그룹"뭔가하지만, 원하는 아마도 당신은 그냥 원하는 " 당신이 할 수있는 정규화되지 않은 "형식도 있습니다. :

db.collection.aggregate([ 
    { "$unwind": "$sockets" }, 
    { "$project": { 
     "_id": 1, 
     "code": "$sockets.code" 
    }} 
]) 
+0

+1 정말 고마워요! –

관련 문제