2012-02-24 29 views
25

Tôi có một bộ sưu tập MongoDB hiện có chứa tên người dùng. Tên người dùng chứa cả chữ thường và chữ thường. Tôi muốn cập nhật tất cả tên người dùng để chúng chỉ chứa chữ thường. Tôi đã thử kịch bản này, nhưng nó đã không làm việc

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

Bất kỳ thông tin về việc này để làm việc sẽ được thực sự đánh giá cao, Scott

+0

* Không hoạt động * == * Không có gì thay đổi *? – Phil

Trả lời

51

MongoDB không có một khái niệm về $toLower như một lệnh. Giải pháp là chạy một vòng lặp lớn for qua dữ liệu và phát hành các bản cập nhật riêng lẻ.

Bạn có thể làm điều này trong bất kỳ trình điều khiển hoặc từ vỏ:

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

Bạn cũng có thể thay thế tiết kiệm với một bản cập nhật nguyên tử:

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

Một lần nữa, bạn cũng có thể làm điều này từ bất kỳ của các trình điều khiển, mã sẽ rất giống nhau.


EDIT: Remon mang đến một điểm tốt. Lệnh $toLower không tồn tại như một phần của khung tổng hợp, nhưng điều này không liên quan gì đến việc cập nhật. Tài liệu để cập nhật là here.

+3

Thực tế là 2.1 MongoDB có $ toLower nhưng nó chỉ là một biểu thức trong khung tổng hợp;) –

+0

Cảm ơn thông tin. Tôi đã kết thúc bằng cách viết một ứng dụng giao diện điều khiển bằng cách sử dụng C#, thay vì cố gắng tìm ra kịch bản cho trình bao. – sveatch42

+1

Bạn đã thử nghiệm biểu mẫu thứ 2 (cập nhật nguyên tử với '$ set') chưa? Tôi không thể làm cho nó hoạt động (không có lỗi nào được hiển thị, nhưng không có tài liệu nào được cập nhật). Tôi mới sử dụng JavaScript, vì vậy tôi có thể chỉ là một sai lầm tân binh. –

0

Chỉ cần ghi chú để đảm bảo trường tồn tại cho tất cả các mục nhập trong bộ sưu tập của bạn. Nếu không, bạn sẽ cần một câu lệnh if, giống như sau:

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

bạn có nghĩa là 'if (e.UserName)' thay vì 'if (e.username)' ? – pravin

0

Với giải pháp chấp nhận Tôi biết nó rất tầm thường để làm tương tự cho một mảng của các yếu tố, chỉ trong trường hợp

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

Rất giải pháp tương tự nhưng điều này đã làm cho tôi trong mongo mới 3.2 Thực hiện những điều sau đây trong Mongo Shell hoặc các công cụ DB tương đương như MongoChef!

db.tag.find({hashtag :{ $exists:true}}).forEach(
function(e) { 
    e.hashtag = e.hashtag.toLowerCase(); 
    db.tag.save(e); 
}); 
Các vấn đề liên quan