Definición
$sliceEl operador de proyección
$sliceespecifica el número de elementos de una matriz que se devolverán en el resultado de la consulta.Nota
Desambiguación
El operador de proyección $slice solo se puede utilizar dentro de una proyección de comandos find. Para utilizar $slice en cualquier lugar donde se pueda utilizar una expresión, consulta el
$sliceoperador de expresión.Para información sobre cómo limitar el tamaño de un arreglo durante una actualización con
$push, consulta el modificador de actualización$slice.
Sintaxis
El $slice tiene una de las siguientes formas sintácticas:
db.collection.find( <query>, { <arrayField>: { $slice: <number> } } );
or
db.collection.find( <query>, { <arrayField>: { $slice: [ <number>, <number> ] } } );
Valor | Descripción |
|---|---|
| Especifica el número de elementos que se devolverán en el
Si el |
| Especifica el número de elementos para devolver en el Para el
Para el |
Comportamiento
$slice del arreglo incrustado
La proyección $slice de una matriz en un documento anidado ya no devuelve los otros campos en el documento anidado cuando la proyección es parte de una proyección de inclusión.
Por ejemplo, considere una colección inventory con documentos que contienen un campo size:
{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }
La siguiente operación proyecta el campo _id (por defecto), el campo qty y el campo details con solo la porción especificada del arreglo colors:
db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )
Es decir, la operación devuelve el siguiente documento:
{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }
Si la proyección $slice forma parte de una proyección de exclusión, la operación continúa devolviendo los demás campos del documento anidado. Es decir, la siguiente proyección es una proyección de exclusión. Esta proyección excluye el campo _id y los elementos del array colors que quedan fuera de la porción especificada, y devuelve todos los demás campos.
db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }
La proyección $slice por sí misma se considera una exclusión.
En versiones anteriores, la proyección $slice también incluía los demás campos del documento anidado, independientemente de si la proyección era una inclusión o una exclusión.
Restricción de visualización
Las operacionesdb.collection.find() en vistas no admiten el operador de proyección $slice.
$ Operador posicional y restricción de $slice
Lasproyecciones find y findAndModify no pueden incluir la expresión de proyección $slice como parte de una expresión de proyección $.
Por ejemplo, la siguiente operación es inválida:
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
En versiones anteriores, MongoDB devuelve el primer elemento (instock.$) del arreglo instock que coincide con la condición de query; es decir, la proyección posicional "instock.$" tiene prioridad y la $slice:1 no realiza ninguna operación. El "instock.$": { $slice: 1 } no excluye ningún otro campo del documento.
Colisión de ruta: $slice de un arreglo y campos incrustados
find y la proyección findAndModify no pueden contener a la vez un $slice de un arreglo y un campo incrustado en el arreglo.
Por ejemplo, considere una colección inventory que contiene un campo de arreglo instock:
{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }
La siguiente operación falla con un error Path collision:
db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )
En versiones anteriores, la proyección aplicaba ambas proyecciones y devolvía el primer elemento ($slice: 1) del arreglo instock, pero suprimía el campo warehouse en el elemento proyectado. A partir de MongoDB 4.4, para lograr el mismo resultado, utiliza el método db.collection.aggregate() con dos etapas $project separadas.
Tip
Ejemplos
Crea una colección de ejemplo posts con los siguientes documentos:
db.posts.insertMany([ { _id: 1, title: "Bagels are not croissants.", comments: [ { comment: "0. true" }, { comment: "1. croissants aren't bagels."} ] }, { _id: 2, title: "Coffee please.", comments: [ { comment: "0. fooey" }, { comment: "1. tea please" }, { comment: "2. iced coffee" }, { comment: "3. cappuccino" }, { comment: "4. whatever" } ] } ])
Devuelve un arreglo con sus primeros 3 elementos
La siguiente operación utiliza el operador de proyección $slice sobre el arreglo comments para devolver el arreglo con sus tres primeros elementos. Si el arreglo tiene menos de tres elementos, se devuelven todos los elementos del arreglo.
db.posts.find( {}, { comments: { $slice: 3 } } )
La operación devuelve los siguientes documentos:
{ "_id" : 1, "title" : "Bagels are not croissants.", "comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ] } { "_id" : 2, "title" : "Coffee please.", "comments" : [ { "comment" : "0. fooey" }, { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" } ] }
Devolver un arreglo con sus últimos 3 elementos
La siguiente operación utiliza el operador de proyección $slice sobre el array comments para devolver el array con sus últimos tres elementos. Si el array tiene menos de tres elementos, se devuelven todos los elementos del array.
db.posts.find( {}, { comments: { $slice: -3 } } )
La operación devuelve los siguientes documentos:
{ "_id" : 1, "title" : "Bagels are not croissants.", "comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ] } { "_id" : 2, "title" : "Coffee please.", "comments" : [ { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" }, { "comment" : "4. whatever" } ] }
Devolver un arreglo con 3 elementos después de omitir el primer elemento
La siguiente operación utiliza el operador de proyección $slice sobre el array comments para:
Omite el primer elemento de manera que el segundo elemento sea el punto de partida.
Luego, devuelve tres elementos desde el punto de inicio.
Si el arreglo tiene menos de tres elementos después del salto, se devuelven todos los elementos restantes.
db.posts.find( {}, { comments: { $slice: [ 1, 3 ] } } )
La operación devuelve los siguientes documentos:
{ "_id" : 1, "title" : "Bagels are not croissants.", "comments" : [ { "comment" : "1. croissants aren't bagels." } ] } { "_id" : 2, "title" : "Coffee please.", "comments" : [ { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" } ] }
Devolver un arreglo con 3 elementos después de omitir el último elemento.
La siguiente operación utiliza el operador de proyección $slice en el array comments para
Sáltese hacia atrás desde el primer elemento de manera que el último elemento sea el punto de partida.
Luego, devuelve tres elementos desde el punto de inicio.
Si el arreglo tiene menos de tres elementos después de la omisión, se devuelven todos los elementos restantes del arreglo.
db.posts.find( {}, { comments: { $slice: [ -1, 3 ] } } )
La operación devuelve los siguientes documentos:
{ "_id" : 1, "title" : "Bagels are not croissants.", "comments" : [ { "comment" : "1. croissants aren't bagels." } ] } { "_id" : 2, "title" : "Coffee please.", "comments" : [ { "comment" : "4. whatever" } ] }