복붙노트

[MONGODB] 방법 그룹 푸시을 제한하는 MongoDB를 집계 파이프 라인

MONGODB

방법 그룹 푸시을 제한하는 MongoDB를 집계 파이프 라인

나는 집계 파이프 라인을 가진 그룹 기능에 밀어 요소의 양을 제한 할 수 없습니다입니다. 이것이 가능한가? 작은 예 :

데이터:

[
    {
        "submitted": date,
        "loc": {
            "lng": 13.739251,
            "lat": 51.049893
        },
        "name": "first",
        "preview": "my first"
    },
    {
        "submitted": date,
        "loc": {
            "lng": 13.639241,
            "lat": 51.149883
        },
        "name": "second",
        "preview": "my second"
    },
    {
        "submitted": date,
        "loc": {
            "lng": 13.715422,
            "lat": 51.056384
        },
        "name": "nearpoint2",
        "preview": "my nearpoint2"
    }
]

여기 내 통합 파이프 라인은 다음과 같습니다

  var pipeline = [{
    //I want to limit the data to a certain area
    $match: {
        loc: {
            $geoWithin: {
                $box: [
                    [locBottomLeft.lng, locBottomLeft.lat],
                    [locUpperRight.lng, locUpperRight.lat]
                ]
            }
        }
    }
},
// I just want to get the latest entries  
{
    $sort: {
        submitted: -1
    }
},
// I group by name
{
    $group: {
        _id: "$name",
        < --get name
        submitted: {
            $max: "$submitted"
        },
        < --get the latest date
        locs: {
            $push: "$loc"
        },
        < --push every loc into an array THIS SHOULD BE LIMITED TO AN AMOUNT 5 or 10
        preview: {
            $first: "$preview"
        }
    }
},
//Limit the query to at least 10 entries.
{
    $limit: 10
}
];

어떻게 10 또는 다른 크기로 LOCS 배열을 제한 할 수 있습니다? 나는 $ 각각 $ 슬라이스 뭔가를 시도했지만 그 작동하지 않습니다.

해결법

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

    1.왼쪽 하단의 좌표를 가정하고 우측 상단 좌표를 [0, 0] 및 [100, 100] 각각이다. MongoDB를 3.2에서 당신은 당신이 원하는 어떤 배열의 하위 집합을 반환하는 $ 슬라이스 연산자를 사용할 수 있습니다.

    왼쪽 하단의 좌표를 가정하고 우측 상단 좌표를 [0, 0] 및 [100, 100] 각각이다. MongoDB를 3.2에서 당신은 당신이 원하는 어떤 배열의 하위 집합을 반환하는 $ 슬라이스 연산자를 사용할 수 있습니다.

    db.collection.aggregate([
        { "$match": { 
            "loc": { 
                "$geoWithin":  { 
                    "$box": [ 
                        [0, 0], 
                        [100, 100]
                    ]
                }
            }}
        }},
        { "$group": { 
            "_id": "$name",
            "submitted": { "$max": "$submitted" }, 
            "preview": { "$first": "$preview" }
            "locs": { "$push": "$loc" }
        }}, 
        { "$project": { 
            "locs": { "$slice": [ "$locs", 5 ] },
            "preview": 1,
            "submitted": 1
        }},
        { "$limit": 10 }
    ])
    
  2. ==============================

    2.당신은 $ 푸시 직접 $ 슬라이스 연산자를 전달하여이 작업을 수행 할 수 있습니다.

    당신은 $ 푸시 직접 $ 슬라이스 연산자를 전달하여이 작업을 수행 할 수 있습니다.

      var pipeline = [{
        //I want to limit the data to a certain area
        $match: {
            loc: {
                $geoWithin: {
                    $box: [
                        [locBottomLeft.lng, locBottomLeft.lat],
                        [locUpperRight.lng, locUpperRight.lat]
                    ]
                }
            }
        }
    },
    // I just want to get the latest entries  
    {
        $sort: {
            submitted: -1
        }
    },
    // I group by name
    {
        $group: {
            _id: "$name",
            < --get name
            submitted: {
                $max: "$submitted"
            },
            < --get the latest date
            locs: {
                $push: {
                  $slice: 10
                }
            },
            < --push every loc into an array THIS SHOULD BE LIMITED TO AN AMOUNT 5 or 10
            preview: {
                $first: "$preview"
            }
        }
    },
    //Limit the query to at least 10 entries.
    {
        $limit: 10
    }
    ];
    
    
  3. from https://stackoverflow.com/questions/24594049/mongodb-aggregation-pipeline-how-to-limit-a-group-push by cc-by-sa and MIT license