sql >> Databáze >  >> NoSQL >> MongoDB

Je možné získat plátek plátku v Mongu?

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í.



  1. Zapomněli jste datovou cestu mongodb

  2. Jak mohu filtrovat, abych vrátil podmnožinu schématu mongoose?

  3. MongoDb $addFields a $match

  4. Nastavení cache_store v inicializátoru