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 :
Matchl'enregistrement avec le nom foo.Unwindle tableau de texte pour accéder au premier niveau.Unwindà nouveau pour atteindre le niveau que nous voulons.Grouples enregistrements par nom.Projectle 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.