Abyste dosáhli $slice, musíte použít agregační kanál řetězce, kvůli omezením v prohlášení projektu, které je součástí vyhledávacího dotazu.
Níže uvedený dotaz je neplatný, protože první $slice by vrátilo pole místo indexu a provedení $slice s vnějším rozsahem selže.
db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})
Navíc neexistuje způsob, jak pracovat na projektovaném poli ve stejném příkazu projektu, pokud je to možné, mohli jsme text dále upravit tak, že na něj použijeme $slice.
Cesta by byla:
Matchzáznam se jménem jako foo.Unwindtextové pole, abyste se dostali na první úroveň.Unwindznovu, abychom se dostali na úroveň, kterou chceme.Groupzáznamy společně podle názvu.Projectposlední záznam ve skupině, který je také posledním prvkem posledního vnořeného pole.
Kód:
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])
nebo pokud byste chtěli promítnout prvek objevující se v určitém pořadí, můžete použít $skip a $limit operace k dosažení tohoto cíle.
var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])
Což promítne druhý prvek v pořadí do vnořených polí.