mongodb에 단일 쿼리가 있는 다중 카운트
저는 MongoDb를 처음 사용하는 사람인데 이 문의에 도움을 주시면 감사하겠습니다.지난 며칠 동안 저는 제 질문과 관련된 것을 찾을 수 있는지 알아보기 위해 머리를 쥐어뜯고 있지만 운이 없었습니다.
아래와 유사한 구조의 문서들이 있는 컬렉션을 가지고 있습니다.
_id: xyz
Movieid: 123
MovieName: Titanic
ReleaseDate: 2000-01-01
_id: uvw
Movieid: 456
MovieName: Titanic II
ReleaseDate: 2018-01-01
_id: pqr
Movieid: 789
MovieName: Titanic III
ReleaseDate:
총 영화, 개봉일이 있는 영화, 개봉일이 없는 영화의 카운트로 아래와 같이 3개의 별도 열에 출력을 달성하고자 합니다.
Total | Released | UnReleased
3 | 2 | 1
카운트를 실행하기 위해 개별 쿼리를 작성할 수는 있었지만 이 모든 것을 단일 쿼리로 성공적으로 통합할 수는 없습니다.최종 목표는 이러한 카운트를 출력으로 생성하는 하나의 뷰를 만드는 것입니다.$and와 같은 연산자를 사용해 보았지만, 원하는 대로 쿼리가 작동하지 않는 것 같습니다.여기까지입니다.
db.getCollection("Movies").aggregate({
"$and": [
{ "$match": { "ReleaseDate": { "$exists": true } }},
{ "$count": "Total" },
{ "$match": { "ReleaseDate": { "$exists": true, "$nin": [""] } }},
{ "$count": "Released" },
{ "$match": { "ReleaseDate": { "$exists": true, "$in": [""] } }},
{ "$count": "Unreleased" }
]
})
아래 집계를 시도할 수 있습니다.
$count
집계는 항상 단일 $match
일치() 조건에 대한 카운트만 제공합니다.따라서 각 카운트를 여러 섹션으로 더 분할해야 합니다. 이는 에서 동일한 입력 문서 집합에서 단일 단계 내에서 여러 집계 파이프라인을 처리함으로써 제공하는 기능입니다.
db.collection.aggregate([
{ "$facet": {
"Total": [
{ "$match" : { "ReleaseDate": { "$exists": true }}},
{ "$count": "Total" },
],
"Released": [
{ "$match" : {"ReleaseDate": { "$exists": true, "$nin": [""] }}},
{ "$count": "Released" }
],
"Unreleased": [
{ "$match" : {"ReleaseDate": { "$exists": true, "$in": [""] }}},
{ "$count": "Unreleased" }
]
}},
{ "$project": {
"Total": { "$arrayElemAt": ["$Total.Total", 0] },
"Released": { "$arrayElemAt": ["$Released.Released", 0] },
"Unreleased": { "$arrayElemAt": ["$Unreleased.Unreleased", 0] }
}}
])
[{
"Total": 3,
"Released": 2,
"Unreleased": 1
}]
아래 집계를 사용할 수 있습니다.
$gt > null
집계 식에 필드가 있는지 확인합니다.
$cond
릴리스 날짜 필터를 기준으로 0 및 1을 출력합니다.
$add
릴리스된 카운트와 릴리스되지 않은 카운트를 모두 출력 합계에 추가합니다.
db.Movies.aggregate([
{"$group":{
"_id":null,
"Unreleased":{"$sum":{"$cond":[{"$and":[{"$gt":["$ReleaseDate",null]},{"$ne":["$ReleaseDate",""]}]},0,1]}},
"Released":{"$sum":{"$cond":[{"$and":[{"$gt":["$ReleaseDate",null]},{"$ne":["$ReleaseDate",""]}]},1,0]}}
}},
{"$addFields":{"Total":{"$add":["$Unreleased","$Released"]}}}
])
db.Movies.aggregate(
// Pipeline
[
// Stage 1
{
$group: {
_id: null,
Total: {
$sum: 1
},
docs: {
$push: '$$ROOT'
}
}
},
// Stage 2
{
$project: {
_id: 0,
Total: 1,
Released: {
$filter: {
input: "$docs",
as: "doc",
cond: {
$ne: ["$$doc.ReleaseDate", ""]
}
}
},
Unreleased: {
$filter: {
input: "$docs",
as: "doc",
cond: {
$eq: ["$$doc.ReleaseDate", ""]
}
}
},
}
},
// Stage 3
{
$project: {
Total: 1,
Released: {
$size: '$Released'
},
UnReleased: {
$size: '$Unreleased'
}
}
},
]
);
언급URL : https://stackoverflow.com/questions/52088666/multiple-counts-with-single-query-in-mongodb
'sourcecode' 카테고리의 다른 글
Git 버전 제어의 패치란 무엇입니까? (0) | 2023.07.03 |
---|---|
해당 요청을 확인하는 방법.QueryString이 ASP.NET에 특정 값을 가지고 있습니까? (0) | 2023.07.03 |
MongoDB에서 제약 조건을 적용하는 방법은 무엇입니까? (0) | 2023.07.03 |
버전을 2.7.0으로 업데이트할 때 Springboot을 시작하는 중 오류 발생 "존재하지 않는 메서드를 호출하려고 했습니다." (0) | 2023.07.03 |
Out Of Memory Error(Java)를 해결하는 방법: GC 오버헤드 제한이 r에서 초과됩니까? (0) | 2023.07.03 |