Musisz użyć potoku agregacji, aby uzyskać $slice łańcucha, ze względu na ograniczenia w oświadczeniu projektu będącym częścią zapytania find.
Poniższe zapytanie jest nieprawidłowe, ponieważ pierwszy $slice zwróci tablicę zamiast indeksu i wykonanie zewnętrznego $slice nie powiedzie się.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Co więcej, nie ma możliwości pracy nad rzutowanym polem w tym samym oświadczeniu projektu, jeśli to możliwe, moglibyśmy dalej modyfikować tekst, stosując do niego $slice.
Droga do zrobienia to:
Matchrekord z nazwą foo.Unwindtablicę tekstową, aby dostać się na pierwszy poziom.Unwindponownie, aby osiągnąć pożądany poziom.Grouprekordy razem według nazwy.Projectostatni rekord w grupie, który jest również ostatnim elementem ostatniej zagnieżdżonej tablicy.
Kodeks:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
lub jeśli chcesz zaprojektować element pojawiający się w określonej kolejności, możesz użyć $skip i $limit operacji, aby to osiągnąć.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Który rzutuje drugi element w kolejności w zagnieżdżonych tablicach.