Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$slice (operador de proyección)

$slice

La $slice El operador de proyección especifica la cantidad de elementos de una matriz que se devolverán en el resultado de la consulta.

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, consulte el operador de $slice 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 <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 <number> es mayor que el número de elementos de la matriz, la consulta devuelve todos los elementos de la matriz.

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

Especifica el número de elementos que se devolverán en <arrayField> después de omitir el número especificado de elementos a partir del primero. Debe 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 saltar hacia atrás n elementos desde el inicio de la matriz, es decir, la posición de índice 0. Según un índice de matriz 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 de la matriz, la posición inicial es el inicio de la matriz.

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

La proyección 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 $slice 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 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. La proyección excluye $slice el _id campo y los elementos de la colors matriz 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

Cree 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 comments array para devolver el array con sus últimos tres elementos. Si el array tiene menos de tres elementos, se devuelven todos.

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 la matriz 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