MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Est-il possible d'obtenir une tranche de tranche à Mongo ?

Vous devez utiliser le pipeline d'agrégation pour obtenir un $slice chaîne, en raison des limitations de la déclaration de projet faisant partie de la requête de recherche.

La requête ci-dessous n'est pas valide car le premier $slice renverrait un tableau, au lieu d'un index, et l'exécution de la portée externe $slice échoue.

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

De plus, il n'y a aucun moyen de travailler sur un champ projeté dans le même énoncé de projet, si possible, nous aurions pu modifier davantage le texte en lui appliquant un $slice.

La marche à suivre serait :

  • Match l'enregistrement avec le nom foo.
  • Unwind le tableau de texte pour accéder au premier niveau.
  • Unwind à nouveau pour atteindre le niveau que nous voulons.
  • Group les enregistrements par nom.
  • Project le dernier enregistrement du groupe qui est aussi le dernier élément du dernier tableau imbriqué.

Le code :

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

ou si vous souhaitez projeter un élément apparaissant dans un ordre particulier, vous pouvez utiliser le $skip et $limit opérations pour y parvenir.

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

Qui projette le deuxième élément dans l'ordre dans les tableaux imbriqués.