2012-02-24 16 views
25

Tengo una colección MongoDB existente que contiene nombres de usuario. Los nombres de usuario contienen letras minúsculas y mayúsculas. Quiero actualizar todos los nombres de usuario para que solo contengan letras minúsculas. He probado este guión, pero no funcionó

db.myCollection.find().forEach(
function(e) { 
e.UserName = $toLower(e.UserName); 
db.myCollection.save(e); 
} 
) 

Cualquier información sobre cómo conseguir que esto funcione será muy apreciada, de Scott

+0

* No funcionó * == * No ha cambiado nada *? – Phil

Respuesta

51

MongoDB no tiene un concepto de $toLower como un comando. La solución es ejecutar un gran bucle for sobre los datos y emitir las actualizaciones de forma individual.

Usted puede hacer esto en cualquier conductor o de la cáscara:

db.myCollection.find().forEach(
    function(e) { 
    e.UserName = e.UserName.toLowerCase(); 
    db.myCollection.save(e); 
    } 
) 

También puede reemplazar el salve con una actualización atómica:

db.myCollection.update({_id: e._id}, {$set: {UserName: e.UserName.toLowerCase() } }) 

Una vez más, también se puede hacer esto desde cualquier de los controladores, el código será muy similar.


EDIT: Remon trae a colación un buen punto. El comando $toLower existe como parte del marco de agregación, pero esto no tiene nada que ver con la actualización. La documentación para actualizar es here.

+3

En realidad desde 2.1 MongoDB tiene $ toLower pero es una expresión dentro del marco de agregación solamente;) –

+0

Gracias por la información. Terminé escribiendo una aplicación de consola usando C#, en lugar de tratar de encontrar un script para el shell. – sveatch42

+1

¿Has probado la segunda forma (actualización atómica con '$ set')? No pude hacer que funcionara (no se mostraron errores, pero no se actualizaron los documentos). Soy nuevo en JavaScript, así que probablemente estoy cometiendo un error de novato. –

0

Solo una nota para asegurarse de que el campo existe para todas las entradas en su colección. Si no se necesita una sentencia if, como la siguiente:

if (e.UserName) e.UserName = e.UserName.toLowerCase(); 
+0

¿Quiere decir 'if (e.UserName)' en lugar de 'if (e.nombre de usuario)' ? – pravin

0

Con la solución aceptada Sé que es muy trivial para hacer lo mismo por una serie de elementos, por si acaso

db.myCollection.find().forEach(
    function(e) { 
     for(var i = 0; i < e.articles.length; i++) { 
      e.articles[i] = e.articles[i].toLowerCase(); 
     } 
     db.myCollection.save(e); 
    } 
) 
1

muy solución similar pero esto me funcionó en el nuevo mongo 3.2 ¡Ejecuta lo siguiente en Mongo Shell o en herramientas equivalentes de DB como MongoChef!

db.tag.find({hashtag :{ $exists:true}}).forEach(
function(e) { 
    e.hashtag = e.hashtag.toLowerCase(); 
    db.tag.save(e); 
}); 
Cuestiones relacionadas