Docs Menu
Docs Home
/ /

$slice (proyección)

$slice

El $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 solo se puede utilizar dentro de una 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 tiene una de las siguientes formas de $slice 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 de la matriz 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 por sí sola se considera una $slice exclusión.

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

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

Las proyeccionesfindyfindAndModifyno pueden incluir la expresión de proyección$slicecomo 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.

find Las findAndModify proyecciones y no pueden contener un de una matriz y un campo incrustado en la $slice matriz.

Por ejemplo, considere una colección inventory que contiene un campo de matriz 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 siguiente operación utiliza el $slice operador de proyección en el comments array para devolver el array con sus tres primeros 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" : "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 modo que el segundo elemento sea el punto de partida.

  • Luego, devuelve tres elementos desde el punto de partida.

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 $slice operador de proyección en la comments matriz para

  • Salta hacia atrás desde el primer elemento de modo que el último elemento sea el punto de partida.

  • Luego, devuelve tres elementos desde el punto de partida.

Si la matriz tiene menos de tres elementos después del salto, se devuelven todos los elementos restantes en la matriz.

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