sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Es posible obtener una rebanada de una rebanada en Mongo?

Debe usar la canalización de agregación para lograr un $slice cadena, debido a las limitaciones en la declaración del proyecto como parte de la consulta de búsqueda.

La siguiente consulta no es válida porque el primer $slice devolvería una matriz, en lugar de un índice, y la ejecución del $slice de ámbito externo falla.

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

Además, no hay forma de trabajar en un campo proyectado en la misma declaración del proyecto; si fuera posible, podríamos haber modificado el texto aún más aplicándole un $segmento.

El camino a seguir sería:

  • Match el registro con el nombre como foo.
  • Unwind la matriz de texto para llegar al primer nivel.
  • Unwind de nuevo para llegar al nivel que queremos.
  • Group los registros juntos por nombre.
  • Project el último registro en el grupo que también es el último elemento de la última matriz anidada.

El código:

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

o si desea proyectar un elemento que aparece en un orden particular, puede usar el $skip y $limit operaciones para lograr esto.

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

Que proyecta el segundo elemento en orden en las matrices anidadas.