[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.바보 집계 트릭의 범주에 떨어지는 종종 간과 도착하는 작은 기술이다.
바보 집계 트릭의 범주에 떨어지는 종종 간과 도착하는 작은 기술이다.
그것의 모든 일을 쿼리는이 문서의 고유 식별자 인, 문서 _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"}} ])
from https://stackoverflow.com/questions/21721479/how-to-get-back-the-original-document-back-after-aggregation by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 데이터베이스를 따기 후 인증합니다 (0) | 2019.12.07 |
---|---|
[MONGODB] 모든 문서의 배열의 단지 중첩 된 문서를 반환하는 방법 (0) | 2019.12.07 |
[MONGODB] 몽구스 (또는 MongoDB를)에서 TransientTransactionError은 무엇인가? (0) | 2019.12.07 |
[MONGODB] MongoDB를, 인덱스 필드에 정규 표현식에 의해 쿼리의 성능 (0) | 2019.12.07 |
[MONGODB] 어떤 문자는 MongoDB를 필드 이름에 사용할 수 없습니다? (0) | 2019.12.07 |