Definición
collModcollModpermite agregar opciones a una colección o modificar las definiciones de vista.Tip
mongoshEn, este comando también se puede ejecutar a través delhideIndex()unhideIndex()Métodos auxiliares y.Los métodos asistente son convenientes para usuarios de
mongosh, pero es posible que no proporcionen el mismo nivel de información que los comandos de base de datos. En los casos en que no se necesite la conveniencia o se requieran campos de retorno adicionales, utiliza el comando de base de datos.Nota
La vista modificada por
collModno se refiere a vistas materializadas. Para obtener más información sobre las vistas materializadas on-demand, se puede consultar$mergeen su lugar.
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El comando tiene la siguiente sintaxis:
db.runCommand( { collMod: <collection or view>, <option1>: <value1>, <option2>: <value2>, ... } )
Para <collection or view>, se puede especificar el nombre de una colección o vista de la base de datos actual.
opciones
Cambiar las propiedades del índice
Para cambiar las opciones de índice, especifica el patrón clave o el nombre de las opciones de índice existentes que se quieran cambiar:
db.runCommand( { collMod: <collection>, index: { keyPattern: <index_spec> | name: <index_name>, expireAfterSeconds: <number>, // Set the TTL expiration threshold hidden: <boolean>, // Change index visibility in the query planner prepareUnique: <boolean>, // Reject new duplicate index entries unique: <boolean> // Convert an index to a unique index }, dryRun: <boolean> } )
Si el índice no existe, el comando da un error con el mensaje "cannot find index <name|keyPattern> for ns <db.collection>".
indexLa opción
indexpuede cambiar las siguientes propiedades de un índice existente:Propiedad del índiceDescripciónexpireAfterSecondsEl número de segundos que determina el umbral de caducidad de una colección de TTL.
Si es exitoso, el comando devuelve un documento que contiene:
expireAfterSeconds_new, el nuevo valor paraexpireAfterSecondsexpireAfterSeconds_old, el valor anterior paraexpireAfterSeconds, si el índice tenía un valor paraexpireAfterSecondsantes.
Modificar la opción de índice
expireAfterSecondsrestablece el$indexStatspara el índice.Si utilizas índices TTL creados antes de MongoDB 5.0, o si deseas sincronizar datos creados en MongoDB 5.0 con una versión anterior a la instalación 5.0, consulta Índices configurados usando NaN para evitar problemas de configuración errónea.
El valor del índice TTL
expireAfterSecondsdebe estar entre0y2147483647, inclusive.hiddenUn booleano que determina si el índice está oculto o no para el planificador de queries.
Si el valor de
hiddencambia, el comando devuelve un documento que contiene tanto los valores antiguos como los nuevos de la propiedad modificada:hidden_oldyhidden_new.Sin embargo, si el valor de
hiddenno ha cambiado (es decir, ocultar un índice ya oculto o desocultar un índice ya no oculto), el comando omite los camposhidden_oldyhidden_newde la salida.Para ocultar un índice, se debe tener el valor featureCompatibilityVersion de
4.4o superior.Al modificar la opción de índice
hiddense restablece el$indexStatspara el índice si el valor cambia.prepareUniqueUn booleano que decide si el índice va a aceptar nuevas entradas duplicadas.
Las nuevas entradas duplicadas producen errores DuplicateKey cuando
prepareUniqueestrue. El índice resultante se puede convertir en un índice único. Para convertir el índice, se puede utilizarcollModcon la opciónunique.Si se actualiza un índice existente para que
prepareUniqueseatrue, no se comprueba si hay entradas de índice duplicadas preexistentes.Novedades en la versión 6.0.
uniqueUn booleano que determina si el índice es único.
No se admite un valor de
false.Cuando
uniqueestrue,collModescanea el índicekeyPatternen busca de duplicados y, a continuación, lo convierte en un índice único si no hay entradas de índice duplicadas.Si se detectan duplicados durante el análisis inicial,
collModdevuelveCannotConvertIndexToUniquey una lista de documentos en conflicto. Para convertir un índice con entradas duplicadas a un índice único, se debe corregir cualquier conflicto reportado y volver a ejecutarcollMod.Para finalizar una conversión, se establece
prepareUniquecomofalse.Para ver un ejemplo de cómo convertir un índice no único en un índice único, se puede consultar Convertir un índice existente en un índice único.
Novedades en la versión 6.0.
dryRunValor por defecto:
falseSolo se utiliza cuando
index.uniqueestrue.Antes de convertir un índice no único en un índice único, se puede ejecutar el comando
collModcondryRun: true. Si se hace, MongoDB verifica la colección en busca de claves duplicadas y devuelve cualquier violación.Se puede utilizar
dryRun: truepara confirmar que se puede convertir un índice para que sea único sin errores.
Validar documentos
validatorvalidatorpermite a los usuarios especificar reglas o expresiones de validación para una colección.La opción
validatorrequiere un documento que especifique las reglas o expresiones de validación. Puedes especificar las expresiones utilizando los mismos operadores que los operadores del query, con la excepción de$near,$nearSphere,$text, y$where.Nota
La validación ocurre durante las actualizaciones e inserciones. Los documentos existentes no pasan por comprobaciones de validación hasta que se modifican.
No se puede especificar un validador para colecciones en las bases de datos
admin,localyconfig.No se puede especificar un validador para las colecciones de
system.*.
validationLevelEl
validationLeveldetermina con qué rigor MongoDB aplica las reglas de validación a los documentos existentes durante una actualización."off"- No hay validación para inserciones o actualizaciones.
"strict"- Por defecto, aplica reglas de validación a todas las inserciones y a todas las actualizaciones.
"moderate"- Aplica reglas de validación a las inserciones y a las actualizaciones en documentos válidos existentes. No apliques reglas a las actualizaciones en documentos inválidos existentes.
Para ver un ejemplo que utiliza
validationLevel, consulte Especificar nivel de validación para documentos existentes.
validationActionLa opción
validationActiondetermina sierrora los documentos no válidos o simplementewarnsobre las infracciones, pero permite documentos no válidos.Importante
La validación de documentos solo se aplica a aquellos documentos según lo determinado por el
validationLevel.Para ver un ejemplo que utiliza
validationAction, consulte Elija cómo gestionar documentos no válidos.
Modificar vistas
Nota
La vista modificada por este comando no se refiere a vistas materializadas. Para hablar de las vistas materializadas on-demand, se puede consultar $merge en su lugar.
viewOnLa colección o vista subyacente de origen. La definición de la vista se determina aplicando el
pipelineespecificado a esta fuente.Necesario si se modifica una vista en una implementación de MongoDB que se ejecuta con control de acceso.
pipelineLa pipeline de agregación que define la vista.
Nota
Necesario si se modifica una vista en una implementación de MongoDB que se ejecuta con control de acceso.
La definición de la vista es pública; es decir, las operaciones
db.getCollectionInfos()yexplainen la vista incluirán el pipeline que define la vista. Por lo tanto, evite referirse directamente a campos y valores sensibles en las definiciones de vistas.
db.runCommand( { collMod: "myView", viewOn: "activities", pipeline: [ { $match: { status: "Q" } }, { $project: { user: 1, date: 1, description: 1} } ] } )
Modificar colecciones de series de tiempo
Nota
Si especificas una modificación en el parámetro timeseries de tu operación collMod, no puedes usar otras opciones de modificación en el mismo comando. Debes realizar modificaciones de series de tiempo en un comando dedicado que sea independiente de otras modificaciones de colección.
expireAfterSecondsNota
Esto es distinto de usar la opción
indexcon la propiedadexpireAfterSecondspara cambiar el tiempo de caducidad de una Colección TTL.Para habilitar la eliminación automática de documentos o modificar el intervalo de caducidad actual de una colección de series de tiempo, se debe cambiar el valor
expireAfterSeconds:db.runCommand( { collMod: <collection>, expireAfterSeconds: <number> | "off" } ) Se puede establecer
expireAfterSecondsen"off"para deshabilitar la eliminación automática, o un número decimal no negativo (>=0) para especificar la cantidad de segundos después de los cuales los documentos caducan.
granularityPara modificar la granularidad de una colección de series de tiempo, se puede aumentar
timeseries.granularityde una unidad de tiempo más corta a una más larga:db.runCommand( { collMod: "weather24h", timeseries: { granularity: "seconds" | "minutes" | "hours" } } ) Para actualizar los campos de bucketing personalizados
bucketRoundingSecondsybucketMaxSpanSecondsen lugar degranularity, se incluyen ambos campos personalizados en el comandocollMody se ponen al mismo valor:db.runCommand( { collMod: "weather24h", timeseries: { bucketRoundingSeconds: 86400, bucketMaxSpanSeconds: 86400 } } ) No se puede disminuir el intervalo de granularidad ni los valores de agrupación personalizados.
Importante
No se puede degradar por debajo de MongoDB 6.3 si alguna colección de series de tiempo especifica explícitamente los campos de agrupamiento personalizados
bucketMaxSpanSecondsybucketRoundingSeconds. Si es posible, se debe convertir a lagranularitycorrespondiente. Si no se puede, se debe descartar la colección antes de degradar.Para convertir una colección de bucketing personalizado a un valor
granularity, tantobucketMaxSpanSecondscomobucketRoundingSecondsdeben ser menores o iguales al equivalentegranularity:granularitybucketRoundingSecondslímite (incluido)bucketMaxSpanSecondslímite (incluido)seconds60
3600
minutes3600
86400
hours86400
2592000
Cambiar el tamaño de una colección con tamaño fijo
Novedades en la versión 6.0.
A partir de MongoDB 6.0, se puede cambiar el tamaño de una colección con tamaño fijo. Para cambiar el tamaño máximo de una colección con tamaño fijo en bytes, se puede utilizar la opción cappedSize. Para cambiar el número máximo de documentos en una colección con tamaño fijo existente, se puede utilizar la opción cappedMax.
Nota
No se pueden usar estos comandos para cambiar el tamaño del oplog. Se debe utilizar replSetResizeOplog en su lugar.
cappedSizeEspecifica un nuevo tamaño máximo, en bytes, para una colección con tamaño fijo.
cappedSizedebe ser mayor que0y menor que1e+15(1 PB).
cappedMaxEspecifica un nuevo número máximo de documentos en una colección con tamaño fijo. Establecer
cappedMaxmenor o igual que0implica que no hay límite.
Por ejemplo, el siguiente comando establece el tamaño máximo de una colección con tamaño fijo en 100000 bytes y establece la cantidad máxima de documentos de la colección en 500:
db.runCommand( { collMod: <collection>, cappedSize: 100000, cappedMax: 500 } )
Change Streams con imágenes previas y posteriores de los documentos
Novedades en la versión 6.0.
A partir de MongoDB 6.0, puedes utilizar eventos de flujo de cambios para generar la versión de un documento antes y después de los cambios (las imágenes previas y posteriores del documento):
La imagen previa es el documento antes de reemplazarlo, actualizarlo o borrarlo. No existe una imagen previa para un documento insertado.
La imagen posterior es el documento tras insertarse, sustituirse o actualizarse. No hay imagen posterior para un documento borrado.
Se puede activar
changeStreamPreAndPostImagespara una colección condb.createCollection(),createocollMod. Por ejemplo, cuando se utiliza el comandocollMod:db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: true } } )
Si se desea utilizar collMod para permitir las imágenes previas y posteriores del flujo de cambios para una colección, se debe utilizar el campo changeStreamPreAndPostImages:
db.runCommand( { collMod: <collection>, changeStreamPreAndPostImages: { enabled: <boolean> } } )
Para permitir las imágenes previas y posteriores del flujo de cambios para una colección, se establece changeStreamPreAndPostImages en true. Por ejemplo:
db.runCommand( { collMod: "orders", changeStreamPreAndPostImages: { enabled: true } } )
Para deshabilitar las imágenes previas y posteriores del flujo de cambios para una colección, se establece changeStreamPreAndPostImages en false. Por ejemplo:
db.runCommand( { collMod: "orders", changeStreamPreAndPostImages: { enabled: false } } )
Las imágenes previas y posteriores no están disponibles para un evento de flujo de cambios si las imágenes fueron:
No está habilitado en la colección en el momento de la operación de actualización o eliminación de un documento.
Eliminado después del tiempo de retención de imágenes previas y posteriores establecido en
expireAfterSeconds.El siguiente ejemplo configura
expireAfterSecondsen100segundos en todo el clúster:use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) Nota
El comando
setClusterParameterno es compatible con los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulta Comandos no compatibles en Atlas.El siguiente ejemplo devuelve la configuración actual de
changeStreamOptions, incluyendoexpireAfterSeconds:db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) Configurar
expireAfterSecondsenoffutiliza la política de retención por defecto: las imágenes previas y posteriores se conservan hasta que los eventos correspondientes del flujo de cambios se eliminan del oplog.Si se elimina un evento de flujo de cambios del oplog, las imágenes previas y posteriores correspondientes también se eliminan independientemente del tiempo de retención de las imágenes previas y posteriores
expireAfterSeconds.
Consideraciones adicionales:
Habilitar las imágenes previas y posteriores consume espacio de almacenamiento y aumenta el tiempo de procesamiento. Habilita solo las imágenes previas y de publicación si las necesitas.
Limita el tamaño del evento del flujo de cambios a menos de 16 mebibytes. Para limitar el tamaño del evento, puedes:
Limita el tamaño del documento a 8 megabytes. Puedes solicitar imágenes previas y posteriores simultáneamente en la salida del flujo de cambios si otros campos de eventos del flujo de cambios como
updateDescriptionno son grandes.Solicita solo imágenes posteriores en la salida del flujo de cambios para documentos de hasta 16 mebibytes si otros campos de eventos del flujo de cambios como
updateDescriptionno son grandes.Solicita solo imágenes previas en la salida del flujo de cambios para documentos de hasta 16 mebibytes si:
las actualizaciones de documento afectan solo a una pequeña fracción de la estructura o el contenido del documento, y
no cause un evento de cambio
replace. Un eventoreplacesiempre incluye la imagen de publicación.
Para realizar una solicitud de imagen previa, debes establecer
fullDocumentBeforeChangeenrequiredowhenAvailableendb.collection.watch(). Para solicitar una imagen posterior, establecefullDocumentmediante el mismo método.Las imágenes previas se escriben en la colección
config.system.preimages.La colección
config.system.preimagespuede agrandarse. Para limitar el tamaño de la colección, puedes establecer el tiempo aexpireAfterSecondspara las imágenes previas como se mostró antes.Las imágenes previas se eliminan de forma asincrónica mediante un proceso en segundo plano.
Importante
Característica incompatible con versiones anteriores
A partir de MongoDB 6.0, si utilizas imágenes previas y posteriores de documentos para los flujos de cambios, debes deshabilitar changeStreamPreAndPostImages para cada colección mediante el comando collMod antes de poder volver a una versión anterior de MongoDB.
Tip
Para los eventos y resultados del flujo de cambios, consulta Eventos de cambio.
Para buscar cambios en una colección, consulta
db.collection.watch().Para obtener ejemplos completos con la salida del flujo de cambios, consulta Flujos de cambio con imágenes previas y posteriores de documentos.
Adjuntar comentario
Opcional. Se puede adjuntar un comentario a este comando. El comentario debe ser un campo de nivel superior y puede ser cualquier tipo BSON válido. El comentario que se especifique aparece junto con los registros de este comando en las siguientes ubicaciones:
Mensajes de registro de mongod, en el campo
attr.command.cursor.comment.Salida del perfilador de base de datos, en el campo
command.comment.currentOpde salida, en el campocommand.comment.
Nivel de confirmación de escritura
Opcional. Un documento que expresa el nivel de confirmación de escritura del comando collMod.
Omite usar el nivel de confirmación de escritura por defecto.
Control de acceso
Si la implementación aplica autenticación/autorización, debes tener el siguiente privilegio para ejecutar el comando collMod:
Tarea | Privilegios requeridos |
|---|---|
Modificar una colección de tamaño ilimitado |
|
Modificar una vista |
El rol con funcionalidad incorporada dbAdmin proporciona los privilegios necesarios.
Comportamiento
Bloqueo de recursos
El comando collMod obtiene un bloqueo de colección sobre la colección especificada mientras dura la operación.
Ejemplos
Cambiar el valor de caducidad de los índices
El siguiente ejemplo actualiza la propiedad expireAfterSeconds de un índice TTL existente { lastAccess: 1 } en una colección llamada user_log. La propiedad de expireAfterSeconds actual para el índice se establece en 1800 segundos (o 30 minutos) y el ejemplo cambia el valor a 3600 segundos (o 60 minutos).
db.runCommand({ collMod: "user_log", index: { keyPattern: { lastAccess: 1 }, expireAfterSeconds: 3600 } })
Si es exitosa, la operación devuelve un documento que incluye el valor anterior y el nuevo de la propiedad modificada:
{ "expireAfterSeconds_old" : 1800, "expireAfterSeconds_new" : 3600, "ok" : 1 }
Ocultar un índice del planificador de query
Nota
Para ocultar un índice, se debe tener el valor featureCompatibilityVersion de 6.0 o superior.
El siguiente ejemplo oculta un índice existente en la colección orders. En concreto, la operación oculta el índice con la especificación { shippedDate: 1 } del planificador de query.
db.runCommand( { collMod: "orders", index: { keyPattern: { shippedDate: 1 }, hidden: true } } )
Si es exitosa, la operación devuelve un documento que incluye el valor anterior y el nuevo de la propiedad modificada:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Nota
Si la operación es exitosa pero el valor de hidden no ha cambiado (específicamente, ocultando un índice ya oculto o desocultando uno que no está oculto), el comando omite los campos hidden_old y hidden_new de la salida.
Para ocultar un índice de texto, se debe especificar el índice por name y no por keyPattern.