복붙노트

[MONGODB] $ 언 와인드는 하늘의 배열

MONGODB

$ 언 와인드는 하늘의 배열

나는 각 문서는 다음과 같은 구조를 가지고 사용자의 컬렉션이 있습니다 :

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

해결이 필드는 비어 있거나 임의의 여러 하위 문서를 포함 할 수있다. 내 목표는 아직 문제를 해결하지 않은 사용자는 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

사전에 감사합니다

해결법

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

    1.MongoDB를 3.2 버전 및 최신으로, $ 언 와인드 운영자는 지금 특히 preserveNullAndEmptyArrays 옵션이 문제를 해결하는 몇 가지 옵션이 있습니다.

    MongoDB를 3.2 버전 및 최신으로, $ 언 와인드 운영자는 지금 특히 preserveNullAndEmptyArrays 옵션이 문제를 해결하는 몇 가지 옵션이 있습니다.

    이 옵션을 true로 설정하고 경로가 null 누락, 하늘의 배열 인 경우, 언 와인드 출력에게 문서를 $됩니다. false의 경우, $ 언 와인드 경로가 누락, null의 경우 출력하지 문서를 수행, 또는 빈 배열입니다. 귀하의 경우에, true로 설정 :

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

    2.여기에서, 용액 - 그것은 필드 역시 존재하지 않고 "해결"있다고 가정 널 동일하거나 문제 해결 및 점수의 배열을 갖는다. 이 사건은이 손잡이는 하늘의 배열 인 "해결"입니다하지 않습니다 - 그건 당신이 추가 할 수있는 간단한 추가 조정이 될 것입니다 있지만.

    여기에서, 용액 - 그것은 필드 역시 존재하지 않고 "해결"있다고 가정 널 동일하거나 문제 해결 및 점수의 배열을 갖는다. 이 사건은이 손잡이는 하늘의 배열 인 "해결"입니다하지 않습니다 - 그건 당신이 추가 할 수있는 간단한 추가 조정이 될 것입니다 있지만.

    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 ([프로젝트 가질 그룹]);

  3. from https://stackoverflow.com/questions/13895006/unwind-empty-array by cc-by-sa and MIT license