title: Como agregar un campo a todos los elementos en una collección Mongo
link: http://jj.isgeek.net/2011/12/como-agregar-un-campo-a-todos-los-elementos-en-una-colleccion-mongo/
author: Jj
description: 
post_id: 827
date: 2011/12/01 23:36:10
created_gmt: 2011/12/02 04:36:10
comment_status: open
slug: como-agregar-un-campo-a-todos-los-elementos-en-una-colleccion-mongo

<!--<a href="http://jj.isgeek.net/2011/12/add-a-key-to-all-items-on-a-mongodb-collection/">Lo acabo de poner en inglés</a>., pero también lo buscarán en español. Asó que aquí va.
<p></p>


<p></p>

Escribo esto por que encontrar la respuesta me tomó más de lo que esperaba. Finalmente <a href="ttp://stackoverflow.com/questions/5587677/mongodb-unconditional-updates">estaba en StackOverflow</a>, pero la pondré acá de nuevo explicando como funciona.-->

[Lo acabo de poner en inglés](/2011/12/add-a-key-to-all-items-on-a-mongodb-collection/)., pero también lo buscarán en español. Asó que aquí va. 

Escribo esto por que encontrar la respuesta me tomó más de lo que esperaba. Finalmente [estaba en StackOverflow](ttp://stackoverflow.com/questions/5587677/mongodb-unconditional-updates), pero la pondré acá de nuevo explicando como funciona. 

Como las bases de datos [Mongo](http://www.mongodb.org/) no tienen esquema, no existe comando `ALTER TABLE `para agregar un nuevo campo a todos los elementos, lo que se hace es actualizar la colección por medio del comando `update`. 

La [documentación de Update](http://www.mongodb.org/display/DOCS/Updating) es muy escasa al respecto y el [mapeo de SQL a Mongo ](http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart)tampoco indica nada al respecto. 

Así es como se hace una modificación a todos los elementos sin ninguna condición en particular: 
    
    
    
    
    
    
    db.collection.update( criteria, objNew, upsert, multi )
    
    
    
    
    

Queremos actializar todos así que nuestra condición será un objeto vacío. 
    
    
    {}

Queremos añadir un nuevo atributo a todos los objetos, así que usaremos la clave "$set" para hacerlo. El valor que mandemos tendrá la forma de un documento que _combinaremos_ con cada uno de los elementos. 
    
    
    {'$set': {new_key:value}}

No queremos Upsert, asi que vamos a poner `False` ahí. Si mandaramos True, además de modificar los documentos, agregaríamos un nuevo elemento a al colección con el documento que estamos enviando como dato, y eso no queremos. 

En multi, decimos que sí: True, esto es necesario para que se actualice toda la colección y no sólo el primer elemento. 

El comando quedaríá así: 
    
    
    
    
    
    
    db.collection.update( {}, {'$set': {new_key:value}}, false, true)