2012-02-24 8 views
25

Mam istniejącą kolekcję MongoDB zawierającą nazwy użytkowników. Nazwy użytkowników zawierają małe i wielkie litery. Chcę zaktualizować wszystkie nazwy użytkowników, aby zawierały tylko małe litery. Próbowałem tego skryptu, ale to nie działa

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

Wszelkie informacje na temat poruszania się to do pracy będzie naprawdę ceniona, Scott

+0

* Nie działa * == * Nic się nie zmieniło *? – Phil

Odpowiedz

51

MongoDB nie mają pojęcia $toLower jako polecenia. Rozwiązaniem jest uruchomienie dużej pętli for w danych i wydanie aktualizacji indywidualnie.

Można to zrobić w dowolnym sterowniku lub z powłoki:

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

Można również wymienić uratować z aktualizacją atomowej:

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

Ponownie, można to zrobić także z dowolnego sterowników, kod będzie bardzo podobny.


EDIT: Remon wychowuje dobry punkt. Komenda $toLower istnieje jako część struktury agregacji, ale nie ma to nic wspólnego z aktualizacją. Dokumentacja do aktualizacji to here.

+3

Właściwie od 2.1 MongoDB ma wartość $ toLower, ale jest wyrażeniem tylko w ramach struktury agregacji;) –

+0

Dzięki za informację. Skończyłem na pisaniu aplikacji konsolowej używającej C#, zamiast próbować znaleźć skrypt dla powłoki. – sveatch42

+1

Czy przetestowałeś drugi formularz (aktualizacja atomów za pomocą '$ set')? Nie mogłem go uruchomić (żadne błędy nie zostały pokazane, ale dokumenty nie zostały zaktualizowane). Jestem nowicjuszem w JavaScript, więc prawdopodobnie popełniam błąd rekrutu. –

0

Tylko uwaga, aby upewnić się, że pole istnieje dla wszystkich wpisów w kolekcji. Jeśli nie będzie trzeba if, jak następuje:

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

czy masz na myśli 'if (nazwa użytkownika eUser)' zamiast 'if (nazwa.user)' ? – pravin

0

Z przyjętego rozwiązania wiem, że bardzo trywialny zrobić to samo dla tablicy pierwiastków, na wszelki wypadek

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

Bardzo podobne rozwiązanie, ale to działało mi w nowym mongo 3.2 Wykonaj następujące w Mongo Shell lub równoważne narzędzia DB jak MongoChef!

db.tag.find({hashtag :{ $exists:true}}).forEach(
function(e) { 
    e.hashtag = e.hashtag.toLowerCase(); 
    db.tag.save(e); 
}); 
Powiązane problemy