복붙노트

[MONGODB] MongoDB를 단일 쿼리로 여러 카운트

MONGODB

MongoDB를 단일 쿼리로 여러 카운트

나는 몽고 DB에 새로운 오전이 쿼리에 어떤 도움을 주셔서 감사합니다. 난 내 쿼리에하지만 행운에 관련된 아무것도 찾을 수 있는지 내 머리를 찢어 일 지난 몇 여기 게시물을 통해 선별되었다.

나는 아래 구조가 유사한 문서의 컬렉션이 있습니다 :

_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 별도의 열에 출시 날짜없이 totalmovies에 대한 수, 출시 날짜와 영화, 영화 등의 출력을 달성하고 싶습니다 :

Total   |   Released  |     UnReleased
 3      |       2     |          1

나는 계산을 실행하는 개별 쿼리를 작성 할 수 있었다, 그러나 나는 성공적으로 단일 쿼리로 모든 것을 통합 할 수 없습니다입니다. 최종 목표는 출력으로이 수를 생산하는 하나의보기를 만드는 것입니다. 내가 가진 나는이 같은 $와 같은 연산자를 사용하여 시도했지만 원하는대로 작업에 쿼리를 얻을 수없는 것 .... 이것까지입니다 :

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"
        }


    ]
);

해결법

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

    1.당신은 $면 집계 아래에 시도 할 수 있습니다

    당신은 $면 집계 아래에 시도 할 수 있습니다

    $ 카운트 집계는 항상 단 하나의 일치 ($ 일치) 조건에 대해 당신에게 수를 줄 것이다. 여러 섹션으로하고 $면 입력 문서의 동일한 세트에서 하나의 단계 내에서 프로세스 여러 집계 파이프 라인에 의해 제공하는 기능의 것을 더 분할에 각각의 수를 필요 그래서.

    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
    }]
    
  2. ==============================

    2.당신은 집계 아래로 사용할 수 있습니다.

    당신은 집계 아래로 사용할 수 있습니다.

    $있다>는 null - 필드가 집계 식에 존재하는지 여부를 확인합니다.

    출력이 0과 1 $ 합 $ COND 발매일 필터에 기초.

    $ 추가 출력 전체에 모두 출시 및 출시되지 않은 수를 추가 할 수 있습니다.

    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"]}}}
    ])
    
  3. ==============================

    3.

    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'
                    }
                }
            },
    
        ]
    
    
    
    );
    
  4. from https://stackoverflow.com/questions/52088666/multiple-counts-with-single-query-in-mongodb by cc-by-sa and MIT license