Трубопровод агрегации Mongodb, как ограничить групповой пуш
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
но это не похоже на работу.
Ответы (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
Вопросы из категории :
- mongodb Обновление вложенных документов в mongodb
- mongodb Когда использовать MongoDB или другие системы, ориентированные на документы?
- mongodb MongoDB: Как обновить несколько документов с помощью одной команды?
- mongodb MongoDB: Можно ли сделать запрос без учета регистра?
- mongodb Может ли MongoDB находиться в процессе?
- mongodb Получить имена всех ключей в коллекции
- mongodb-query mongodb: insert if not exists
- mongodb-query MongoDB Regex Поиск по целочисленному значению
- mongodb-query Найти объекты между двумя датами MongoDB
- mongodb-query Как запросить MongoDB с «лайк»?
- mongodb-query В MongoDB как вы используете $ set для обновления вложенного значения / встроенного документа?
- aggregation-framework Обновить поле MongoDB, используя значение другого поля
- aggregation-framework Получить только запрошенный элемент в массиве объектов в коллекции MongoDB
- aggregation-framework MongoDB: Combine data from multiple collections into one..how?
- aggregation-framework Найти все дубликаты документов в коллекции MongoDB по ключевому полю