sql >> Database >  >> NoSQL >> MongoDB

Is het mogelijk om een ​​plakje van een plakje te krijgen in Mongo?

U moet de aggregatiepijplijn gebruiken om een ​​$slice . te verkrijgen keten, vanwege de beperkingen in de projectverklaring die deel uitmaakt van de zoekopdracht.

De onderstaande zoekopdracht is ongeldig omdat de eerste $slice zou een array retourneren, in plaats van een index, en de uitvoering van de buitenste scoped $slice mislukt.

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

Bovendien is er geen manier om aan een geprojecteerd veld in dezelfde projectverklaring te werken, indien mogelijk hadden we de tekst verder kunnen wijzigen door er een $slice op toe te passen.

De manier om te gaan zou zijn:

  • Match het record met de naam foo.
  • Unwind de tekstarray om naar het eerste niveau te gaan.
  • Unwind opnieuw om het gewenste niveau te bereiken.
  • Group de records samen op naam.
  • Project het laatste record in de groep dat ook het laatste element is van de laatste geneste array.

De code:

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

of als u een element in een bepaalde volgorde wilt projecteren, dan kunt u de $skip gebruiken en $limit operaties om dit te bereiken.

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

Welke het tweede element op volgorde projecteert in de geneste arrays.



  1. Update meerdere documenten ATOMISCH EN stuur ze terug

  2. Hoe ingesloten document in mangoest bij te werken?

  3. Hoe mongo-groep aan de Meteor-serverzijde te doen?

  4. Mongolab verbindingsfout