2017-12-29 1 views
0

다음은 MongoDB 쿼리 및 집계 퍼즐입니다. 일부 샘플 기록을 주먹 :문서 하위 집합에 대한 고유 필드 값

# Document 1 
{ 
    items: [ 
    { 
     type: "X", 
     id: 123 
    }, 
    { 
     type: "Y", 
     id: 456 
    } 
    ] 
} 

# Document 2 
{ 
    items: [ 
    { 
     type: "A", 
     id: 789 
    }, 
    { 
     type: "B", 
     id: 321 
    } 
    ] 
} 

# Document 3 
{ 
    items: [ 
    { 
     type: "P", 
     id: 987 
    }, 
    { 
     type: "X", 
     id: 654 
    } 
    ] 
} 

# Document 4 
{ 
    items: [ 
    { 
     type: "Q", 
     id: 246 
    }, 
    { 
     type: "X", 
     id: 654 
    } 
    ] 
} 

내 목표는 idtype: X 요소와 관련된 id입니다 어디 type: X 포함 된 문서에 대한 모든 별개의 id 값을 찾는 것입니다.

예를 들어, 위에서, 내가 할 수있는 내 결과를 원하는 것입니다 :

[ 123, 654 ]

다음은 type: X과 관련된 id 필드의 고유 한 값입니다.

답변

1

귀하의 물품은 unwinding으로 시작할 수 있습니다. 그런 다음 유형으로 걸러 낼 수 있습니다. 마지막 단계에서 중복을 제거 할 $addToSet 연산자를 활용할 수 있습니다. _id: 1로 그룹화

db.collection.aggregate([ 
    { $unwind: "$items" }, 
    { $match: { "items.type": "X" } }, 
    { 
    $group: { 
     _id: 1, 
     ids: { $addToSet: "$items.id" } 
    } 
    } 
]) 

내가 무엇에 의해 그룹화하고 있습니다 것을 의미한다 : 나는 모든 것을 하나의 그룹의 일부가 될 것을 알고,하지만 난 addToSet $를 사용해야합니다.

1

아래의 집계를 사용하여 고유 ID를 얻을 수 있습니다.

$filters 유형이 입력되는 항목 다음에 일치하는 항목을 입력하려면 $arrayElemAt을 입력하고 id 필드를 추출하려면 $let을 입력하십시오.

$group 모든 항목은 $addToSet 고유 값을 출력합니다.

db.collection_name.aggregate([{"$group":{ 
    "_id":null, 
    "ids":{ 
    "$addToSet":{ 
     "$let":{ 
     "vars":{ 
      "obj":{ 
      "$arrayElemAt":[ 
       {"$filter":{ 
       "input":"$items", 
       "cond":{"$eq":["$$this.type","X"]} 
       }}, 
       0 
      ] 
      } 
     }, 
     "in":"$$obj.id" 
     } 
    } 
    } 
}}]) 
관련 문제