Трубопровод агрегации Mongodb, как ограничить групповой пуш

mongodb mongodb-query aggregation-framework

5007 просмотра

2 ответа

Я не могу ограничить количество отправляемых элементов в групповой функции с конвейером агрегации. Это возможно? Небольшой пример:

Данные:

[
    {
        "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
}
];

Как я могу ограничить locsмассив 10или любой другой размер? Я пытался что - то с $eachи , $sliceно это не похоже на работу.

Автор: chaosbohne Источник Размещён: 12.11.2019 09:26

Ответы (2)


19 плюса

Предположим, что нижние левые координаты и верхние правые координаты соответственно [0, 0]и [100, 100]. Из MongoDB 3.2 вы можете использовать $sliceоператор для возврата подмножества массива, которое вам нужно.

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 }
])
Автор: styvane Размещён: 19.10.2015 06:14

0 плюса

Вы можете добиться этого, передавая $sliceоператора непосредственно в $push.

  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
}
];

Автор: hitesh Размещён: 10.10.2019 11:21
Вопросы из категории :
32x32