sql >> Databasteknik >  >> NoSQL >> MongoDB

Är det möjligt att få en skiva av en skiva i Mongo?

Du måste använda aggregeringspipelinen för att uppnå en $slice kedjan, på grund av att begränsningarna i projektbeskrivningen är en del av sökfrågan.

Frågan nedan är ogiltig eftersom den första $slice skulle returnera en array, istället för ett index, och exekveringen av den yttre scoped $slice misslyckas.

db.collection.find({"name":"foo"},{text: {$slice:[{$slice: [1,1]}]}})

Dessutom finns det inget sätt att arbeta på ett projicerat fält i samma projektbeskrivning, om möjligt hade vi kunnat modifiera texten ytterligare genom att applicera en $slice på den.

Vägen att gå skulle vara:

  • Match posten med namnet som foo.
  • Unwind textfältet för att komma till den första nivån.
  • Unwind igen för att komma till den nivå vi vill ha.
  • Group posterna tillsammans efter namn.
  • Project den sista posten i gruppen som också är det sista elementet i den senast kapslade arrayen.

Koden:

db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$group:{"_id":"$name","text":{$last:"$text"}}},
{$project:{"name":"$_id","text":1}}
])

eller om du vill projicera ett element som visas i en viss ordning, kan du använda $skip och $limit åtgärder för att uppnå detta.

var orderOfElement = 2;
db.collection.aggregate([
{$match:{"name":"foo"}},
{$unwind:"$text"},
{$unwind:"$text"},
{$skip:orderOfElement -1},
{$limit:1}
])

Som projicerar det andra elementet i ordning i de kapslade arrayerna.



  1. MongoDB konverterar strängtyp till flyttyp

  2. Sortering på Flera fält mongo DB

  3. Hur man gör grundläggande WATCH med StackExchange.Redis

  4. Hur utför man addToSet med Go officiella drivrutin?