2014-07-06 19 views
16

Non sono in grado di limitare la quantità di elementi inseriti in una funzione di gruppo con la pipeline di aggregazione. È possibile? Piccolo esempio:Pipeline di aggregazione Mongodb come limitare un push di gruppo

dati:

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

Ecco la mia aggregazione gasdotto:

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

Come posso limitare la locs array per 10 o qualsiasi altro formato? Ho provato qualcosa con $each e $slice ma non sembra funzionare.

risposta

14

Supponiamo che le coordinate in basso a sinistra e le coordinate in alto a destra siano rispettivamente [0, 0] e [100, 100]. Da MongoDB 3.2 è possibile utilizzare l'operatore $slice per restituire un sottoinsieme di un array che è ciò che si desidera.

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

Non c'è un modo per farlo direttamente con la semplice pressione? – Nickpick

+0

Al momento non è possibile effettuare questa operazione @Nickpick – styvane

Problemi correlati