bestsource

Mongodb - 조건부인 경우 집계 $push

bestsource 2023. 5. 24. 22:15
반응형

Mongodb - 조건부인 경우 집계 $push

나는 문서 묶음을 집계하려고 합니다.제가 $push하고 싶은 서류에는 두 개의 필드가 있습니다.그러나 "_id" 및 "A" 필드라고 가정하고, "A"가 $gt 0이면 $push "_id" 및 "A"만 원합니다.

저는 두 가지 접근법을 시도했습니다.

첫 번째.

db.collection.aggregate([{
"$group":{
    "field": {
        "$push": {
            "$cond":[
                {"$gt":["$A", 0]},
                {"id": "$_id", "A":"$A"},
                null
            ]
        }
    },
    "secondField":{"$push":"$B"}
}])

하지만 이렇게 하면 null 값이 "필드"로 푸시되므로 필요하지 않습니다.

두 번째.

db.collection.aggregate([{
"$group":
    "field": {
        "$cond":[
            {"$gt",["$A", 0]},
            {"$push": {"id":"$_id", "A":"$A"}},
            null
        ]
    },
    "secondField":{"$push":"$B"}
}])

두 번째 방법은 전혀 효과가 없습니다.

다른 경우에 $push를 건너뛸 수 있는 방법이 있습니까?

추가됨:

예상 문서:

{
    "_id":objectid(1),
    "A":2,
    "B":"One"
},
{
    "_id":objectid(2),
    "A":3,
    "B":"Two"
},
{
    "_id":objectid(3),
    "B":"Three"
}

예상 출력:

{
    "field":[
        {
            "A":"2",
            "_id":objectid(1)
        },
        {
            "A":"3",
            "_id":objectid(2)
        },
    ],
    "secondField":["One", "Two", "Three"]
}

사용할 수 있습니다."$$REMOVE":

  • 이 시스템 변수는 버전 3.6(mongodb 문서)에 추가되었습니다.
db.collection.aggregate([{
   $group:{
       field: {
          $push: {
              $cond:[
                { $gt: ["$A", 0] },
                { id: "$_id", A:"$A" },
                "$$REMOVE"
            ]
          }
        },
        secondField:{ $push: "$B" }
    }
])

이러한 방식으로 null을 필터링할 필요가 없습니다.

@Beeram이 제안한 게시물을 읽고 질문에 대한 답변입니다.

db.collection.aggregate([{
"$group":{
    "field": {
        "$push": {
            "$cond":[
                {"$gt":["$A", 0]},
                {"id": "$_id", "A":"$A"},
                null
            ]
        }
    },
    "secondField":{"$push":"$B"}
},
{
    "$project": {
        "A":{"$setDifference":["$A", [null]]},
        "B":"$B"
    }
}])

또 다른 옵션은 $filter 연산자를 사용하는 것입니다.

db.collection.aggregate([
{ 
    $group : {
        _id: null,
        field: { $push: { id: "$_id", A : "$A"}},
        secondField:{ $push: "$B" }
    }
},
{
    $project: {
        field: {
            $filter: {
                input: "$field",
                as: "item",
                cond: { $gt: [ "$$item.A", 0 ] }
            }
        },
        secondField: "$secondField"
    }       
}])

첫 번째 단계에서는 어레이를 결합하고 두 번째 단계에서는 필터링합니다.

 $group: {
        _id: '$_id',
        tasks: {
          $addToSet: {
            $cond: {
              if: {
                $eq: [
                  {
                    $ifNull: ['$tasks.id', ''],
                  },
                  '',
                ],
              },
              then: '$$REMOVE',
              else: {
                id: '$tasks.id',
                description: '$tasks.description',
                assignee: {
                  $cond: {
                    if: {
                      $eq: [
                        {
                          $ifNull: ['$tasks.assignee._id', ''],
                        },
                        '',
                      ],
                    },
                    then: undefined,
                    else: {
                      id: '$tasks.assignee._id',
                      name: '$tasks.assignee.name',
                      thumbnail: '$tasks.assignee.thumbnail',
                      status: '$tasks.assignee.status',
                    },
                  },
                },
              },
            },
          },
        },
     }

언급URL : https://stackoverflow.com/questions/49687020/mongodb-aggregation-push-if-conditional

반응형