Трябва да използвате тръбопровода за агрегиране, за да постигнете $slice верига, поради ограниченията в изявлението на проекта, което е част от заявката за намиране.
Заявката по-долу е невалидна, защото първият $slice ще върне масив, вместо индекс, и изпълнението на външния обхват $slice не успее.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Освен това няма начин да работим върху проектирано поле в същия оператор на проекта, ако е възможно, бихме могли да променим текста допълнително, като приложим $slice към него.
Начинът, който трябва да направите, е:
Matchзаписът с име като foo.Unwindтекстовия масив, за да стигнете до първото ниво.Unwindотново, за да стигнем до нивото, което искаме.Groupзаписите заедно по име.Projectпоследният запис в групата, който е и последният елемент от последния вложен масив.
Кодът:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
или ако искате да проектирате елемент, появяващ се в определен ред, можете да използвате $skip и $limit операции за постигане на това.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Което проектира втория по ред елемент във вложените масиви.