sourcecode

mongodb에 단일 쿼리가 있는 다중 카운트

copyscript 2023. 7. 3. 23:06
반응형

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

반응형