Vous devez utiliser le pipeline d'agrégation pour obtenir un $slice
chaîne, en raison des limitations de la déclaration de projet faisant partie de la requête de recherche.
La requête ci-dessous n'est pas valide car le premier $slice
renverrait un tableau, au lieu d'un index, et l'exécution de la portée externe $slice
échoue.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
De plus, il n'y a aucun moyen de travailler sur un champ projeté dans le même énoncé de projet, si possible, nous aurions pu modifier davantage le texte en lui appliquant un $slice.
La marche à suivre serait :
Match
l'enregistrement avec le nom foo.Unwind
le tableau de texte pour accéder au premier niveau.Unwind
à nouveau pour atteindre le niveau que nous voulons.Group
les enregistrements par nom.Project
le dernier enregistrement du groupe qui est aussi le dernier élément du dernier tableau imbriqué.
Le code :
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
ou si vous souhaitez projeter un élément apparaissant dans un ordre particulier, vous pouvez utiliser le $skip
et $limit
opérations pour y parvenir.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Qui projette le deuxième élément dans l'ordre dans les tableaux imbriqués.