Трябва да използвате тръбопровода за агрегиране, за да постигнете $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}
])
Което проектира втория по ред елемент във вложените масиви.