source

$빈 배열 찾기

ittop 2023. 5. 22. 21:40
반응형

$빈 배열 찾기

각 문서의 구조가 다음과 같은 사용자 모음이 있습니다.

{
  "_id": "<id>",
  "login": "xxx",
  "solved": [
    {
      "problem": "<problemID>",
      "points": 10
    },
    ...
  ]
}

필드solved비어 있거나 임의의 많은 하위 문서를 포함할 수 있습니다.제 목표는 사용자 목록과 총 점수(합계)를 함께 얻는 것입니다.points)에서 아직 문제를 해결하지 못한 사용자에게는 총 0점이 할당됩니다.단일 쿼리(이상적으로 집계 프레임워크 사용)로 이 작업을 수행할 수 있습니까?

집계 프레임워크에서 다음 쿼리를 사용하려고 했습니다.

{ "$group": {
  "_id": "$_id",
  "login": { "$first": "$login" },
  "solved": { "$addToSet": { "points": 0 } }
} }
{ "$unwind": "$solved" }
{ "$group": {
  "_id": "$_id",
  "login": { "$first": "$login" },
  "solved": { "$sum": "$solved.points" }
} }

그러나 다음과 같은 오류가 발생합니다.

exception: The top-level _id field is the only field currently supported for exclusion

잘 부탁드립니다.

MongoDB 3.2 버전 이상에서는 운영자에게 몇 가지 옵션이 제공됩니다.preserveNullAndEmptyArrays옵션이 이 문제를 해결할 것입니다.

이 옵션이 true로 설정되어 있고 경로가 null, 누락 또는 빈 배열인 경우 문서를 출력합니다.거짓인 경우 경로가 null이거나 누락되었거나 배열이 비어 있으면 문서를 출력하지 않습니다.이 경우 true로 설정합니다.

db.collection.aggregate([
    { "$unwind": {
        "path": "$solved",
        "preserveNullAndEmptyArrays": true
    } },
    { "$group": {
        "_id": "$_id",
        "login": { "$first": "$login" },
        "solved": { "$sum": "$solved.points" }
    } }
])

해결 방법은 다음과 같습니다. "해결된" 필드가 없거나 null과 같거나 일련의 문제와 점수가 해결된 것으로 가정합니다.처리할 수 없는 경우는 빈 배열로 "해결"됩니다. 이는 간단한 추가 조정이 될 수 있습니다.

project = {$project : {
        "s" : {
            "$ifNull" : [
                "$solved",
                [
                    {
                        "points" : 0
                    }
                ]
            ]
        },
        "login" : 1
    }
};
unwind={$unwind:"$s"};
group= { "$group" : {
        "_id" : "$_id",
        "login" : {
            "$first" : "$login"
        },
        "score" : {
            "$sum" : "$s.points"
        }
    }
}

db.students.aggregate( [ project, unwind, group ] );

$165, $swind 내부 조회 어레이는 비어 있을 수 있습니다.


  let posts = await Post.aggregate<ActivityDoc>([
    {
      $match: {
        _id: new mongoose.Types.ObjectId(req.params.id),
      },
    },
    {
      $lookup: {
        from: 'users',
        localField: 'user',
        foreignField: '_id',
        as: 'user',
      },
    },
    {
      $unwind: '$user',
    },
    {
      $unwind: {
        path: '$user.follower',
        preserveNullAndEmptyArrays: true,
      },
    },
    {
      $match: {
        $or: [
          {
            $and: [
              {
                'privacy.mode': {
                  $eq: PrivacyMode.EveryOne,
                },
              },
            ],
          },
          {
            $and: [
              {
                'privacy.mode': {
                  $eq: PrivacyMode.MyCircle,
                },
              },
              {
                'user.follower.id': {
                  $eq: req.currentUser?.id,
                },
              },
            ],
          },
        ],
      },
    },
  ]);

언급URL : https://stackoverflow.com/questions/13895006/unwind-empty-array

반응형