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:
Match
záznam se jménem jako foo.Unwind
textové pole, abyste se dostali na první úroveň.Unwind
znovu, abychom se dostali na úroveň, kterou chceme.Group
záznamy společně podle názvu.Project
poslední 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í.