Une façon de le faire serait la suivante (il n'y a pas besoin de l'étape $match en fonction de la structure de vos données et de votre configuration d'indexation, vous voudrez peut-être toujours la conserver, cependant, pour des raisons de performances) :
db.item.aggregate([
{ "$project": {
"items": {
"$slice": [
{ "$filter": {
"input": "$items",
"as": "item",
"cond": { "$eq": [ "$$item.status", "active" ] }
}},
-3,2
]
}
}}
])
Je pense qu'il est probablement préférable d'utiliser la requête suivante :
db.items.db.aggregate([
{
$project: {
"items": {
"$filter": {
"input": "$items",
"as": "item",
"cond": { "$eq": [ "$$item.status", "active" ] }
}
}
}
}, {
$project: {
"items": {
$slice: [
{
$slice: [
"$items",
{
$subtract: [ { $size: "$items" }, 1 ] // length of items array minus one
}
]
}, 2 // max two elements
]
}
}
}])
car celui-ci va d'abord se débarrasser du dernier élément, puis limiter la sortie à deux éléments, ce qui est probablement plus ce que vous voulez dans une situation avec moins de 3 éléments "actifs".