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:
Match
rekord z nazwą foo.Unwind
tablicę tekstową, aby dostać się na pierwszy poziom.Unwind
ponownie, aby osiągnąć pożądany poziom.Group
rekordy razem według nazwy.Project
ostatni 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.