Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

$slice (operador de proyección)

$slice

La $slice El operador de proyección especifica el número de elementos de un arreglo que se devolverán en el resultado de la query.

Nota

Desambiguación

El operador de proyección $slice sólo se puede utilizar dentro de un proyección del comando find. Para usar $slice en cualquier lugar donde se pueda usar una expresión, consulta el operador $slice 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.

El $slice tiene una de las siguientes formas de sintaxis:

db.collection.find(
<query>,
{ <arrayField>: { $slice: <number> } }
);

or

db.collection.find(
<query>,
{ <arrayField>: { $slice: [ <number>, <number> ] } }
);
Valor
Descripción

$slice: <number>

Especifica el número de elementos que se devolverán en el <arrayField>. Para <number>:

  • Especifique un número positivo n para devolver los primeros n elementos.

  • Especifique un número negativo n para devolver los últimos n elementos.

Si el <number> es mayor que el número de elementos del arreglo, la query devuelve todos los elementos del arreglo.

$slice: [ <number to skip>, <number to return> ]

Especifica el número de elementos para devolver en el <arrayField> después de omitir el número especificado de elementos comenzando desde el primer elemento. Debes especificar ambos elementos.

Para el <number to skip>:

  • Especifica un número positivo n para omitir n elementos desde el inicio del arreglo; es decir, la posición del índice 0. Basado en un índice de arreglo que comienza en cero, 1 indica la posición inicial del segundo elemento, etc. Si n es mayor que el número de elementos en el arreglo, la query arroja un arreglo vacío para el <arrayField>.

  • Especifique un número negativo n para omitir n elementos hacia atrás desde el inicio del arreglo; es decir, la posición del índice 0. Según un índice de arreglo basado en cero (es decir, el primer elemento está en el índice 0), -1 indica la posición inicial del último elemento, etc. Si el valor absoluto del número negativo es mayor que el número de elementos del arreglo, la posición inicial es el inicio del arreglo.

Para el <number to return>, debe especificar un número positivo n para devolver los siguientes n elementos, comenzando después de omitir el número especificado.

La $slice proyección de un arreglo en un documento anidado ya no devuelve los demás campos del documento anidado cuando la proyección forma 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 en el documento anidado. Es decir, la siguiente proyección es una proyección de exclusión. La proyección excluye el campo _id y los elementos del arreglo 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í sola se considera como exclusión.

En versiones anteriores, la proyección $slice también incluía los demás campos en el documento anidado, independientemente de si la proyección era de inclusión o exclusión.

Las operaciones db.collection.find() en vistas no con compatibles con el operador de proyección $slice.

find y findAndModify la proyección no puede incluir la expresión de proyección $slice como parte de $ la 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.

find y findAndModify la proyección no puede contener tanto un $slice de un arreglo como un campo embebido 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

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" } ]
}
])

La operación siguiente utiliza el operador de proyección $slice en 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 en el 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" } ]
}

La siguiente operación utiliza el $slice operador de proyección en el arreglo comments para devolver el arreglo con sus tres últimos 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" : "2. iced coffee" }, { "comment" : "3. cappuccino" }, { "comment" : "4. whatever" } ]
}

La siguiente operación utiliza el operador de proyección $slice sobre el arreglo 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" } ]
}

La siguiente operación utiliza el operador de proyección $slice en el arreglo 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" } ]
}

Volver

$elemMatch

En esta página