examples ejemplos ejemplo consultas complejas mongodb mongodb-query aggregation-framework

ejemplos - Tubería de agregación de Mongodb cómo limitar un empuje de grupo



match mongodb (1)

Supongamos que las coordenadas de la parte inferior izquierda y las coordenadas de la derecha superior son respectivamente [0, 0] y [100, 100] . Desde MongoDB 3.2 puede usar el operador $slice para devolver un subconjunto de una matriz que es lo que desea.

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

No puedo limitar la cantidad de elementos empujados en una función de grupo con el canal de agregación. es posible? Pequeño ejemplo:

Datos:

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

Aquí está mi canalización de agregación:

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

¿Cómo puedo limitar la matriz de locs a 10 o cualquier otro tamaño? Intenté algo con $each y $slice pero eso no parece funcionar.