복붙노트

[MONGODB] 통합 후 원본 문서 등을 다시 얻는 방법

MONGODB

통합 후 원본 문서 등을 다시 얻는 방법

나는 내가 배열 필드 "형태"에서 항목의 번호가 문서의 컬렉션을 조회 할 경우가 있습니다. 해결하는 문제는 모든 문서 "폐쇄"의 특정 상태 "형태"에 포함 된 경우에만 문서를 반환하고자했다.

그래서 여기 컬렉션에 두 개의 서로 다른 문서의 예입니다 :

{
    "_id" : "Tvq444454j",
    "name" : "Jim",
    "forms" : [
        {
            "name" : "Jorney",
            "status" : "closed"
        },
        {
            "name" : "Women",
            "status" : "void"
        },
        {
            "name" : "Child",
            "status" : "closed"
        },
        {
            "name" : "Farm",
            "status" : "closed"
        }
    ]
},

{
    "_id" : "Tvq579754r",
    "name" : "Tom",
    "forms" : [
        {
            "name" : "PreOp",
            "status" : "closed"
        },
        {
            "name" : "Alert",
            "status" : "closed"
        },
        {
            "name" : "City",
            "status" : "closed"
        },
        {
            "name" : "Country",
            "status" : "closed"
        }
    ]
}

그리고 예상 된 결과 :

{
    "_id" : "Tvq579754r",
    "name" : "Tom",
    "forms" : [
        {
            "name" : "PreOp",
            "status" : "closed"
        },
        {
            "name" : "Alert",
            "status" : "closed"
        },
        {
            "name" : "City",
            "status" : "closed"
        },
        {
            "name" : "Country",
            "status" : "closed"
        }
    ]
}

이러한 조건 하에서 상기 어레이의 모든 요소와 일치하는 표준 쿼리 연산자 없기 때문에, 용액 응집을 사용하여 발견되었다. 이 "폐쇄"의 상태로 설정 그들의 "형태"모든 요소가 컬렉션에있는 문서의 _id를 반환합니다.

db.forms.aggregate([
    {$unwind: "$forms" },
    {$group: { _id: "$_id", status: {$addToSet: "$forms.status" }}},
    {$unwind: "$status"},
    {$sort: { _id: 1, status: -1 }},
    {$group: {_id: "$_id", status: {$first: "$status"}}},
    {$match:{ status: "closed" }}
])

나는 결과에 많은 문서를 반환 할 것으로 예상된다 그래서, 나는 또 다른 발견을 발행 피하기 위해 같은 것, 또는 발견의 시리즈는 반환 _id의 일치하는 문서를 얻을 수 있습니다.

이 고려할 수있는 방법이가 컬렉션에로 여전히 필터링의 유형을하는 동안 나는 원본 문서가 정확히 같은 형태로 집계에서 백업받을 수 있나요?

해결법

  1. ==============================

    1.바보 집계 트릭의 범주에 떨어지는 종종 간과 도착하는 작은 기술이다.

    바보 집계 트릭의 범주에 떨어지는 종종 간과 도착하는 작은 기술이다.

    그것의 모든 일을 쿼리는이 문서의 고유 식별자 인, 문서 _id 주위를 그룹화합니다. 주요 포인트가 생각하는 그래서 전체 문서가 실제로 이미 고유 식별자입니다. 그래서 그 대신 단지 _id 키를 보관 한의, 전체 문서를 사용합니다.

        {$project: { 
            _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
        },
    

    이것이 어디 _id에 의해 압연 완료 아무것도 그것의 원래 형태에서 문서를 유지합니다. 다른 모든 집계 단계의 끝에서, 진정한 원본 문서 양식을 복원하려면 최종 $ 프로젝트를 실행합니다

        {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
    

    그럼 당신은 당신이 원하는 필터링 된 결과를해야합니다. 고급이 쿼리의 경우와 같은 필터링과 함께 사용할 때 모든 결과에 추가 발견을 발행 할 필요가 제거로이 기술은 매우 유용 할 수 있습니다.

    또한, 당신은 특정 조건 세트와 일치하려고하는 결과 세트를 찾고 있습니다 알고 이러한 경우에, 집계 파이프 라인의 첫 단계로 $ 일치 연산자를 사용합니다. 이뿐만 아니라 작업 집합 크기를 줄이는 데 유용하지만, 그것은 또한 당신이 인덱스와 위치를 크게 쿼리 성능을 향상시킬 수의 사용을 만들 수있는 유일한 단계입니다.

    전체 프로세스 함께 :

    db.forms.aggregate([
        {$match: { "forms.status": "closed" } },
        {$project: { 
            _id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
        },
        {$unwind: "$forms"},
        {$group: { _id: "$_id", status: {$addToSet: "$forms.status"}}},
        {$unwind: "$status"},
        {$sort: { _id: 1, status: -1} },
        {$group: { _id: "$_id", status: {$first: "$status"} }},
        {$match: { status: "closed"}},
        {$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
    ])
    
  2. from https://stackoverflow.com/questions/21721479/how-to-get-back-the-original-document-back-after-aggregation by cc-by-sa and MIT license