2011-05-31 7 views
8

Sử dụng vỏ mongodb, tôi đang cố thêm thuộc tính mới vào từng tài liệu trong một bộ sưu tập lớn. Bộ sưu tập (Liệt kê) có một thuộc tính hiện có tên là Địa chỉ. Tôi chỉ đơn giản là cố gắng thêm một thuộc tính mới gọi là LowerCaseAddress có thể được sử dụng để tìm kiếm để tôi không cần phải sử dụng một regex phân biệt chữ hoa chữ thường để đối sánh địa chỉ, điều này rất chậm.Thêm thuộc tính mới vào từng tài liệu trong bộ sưu tập lớn

Đây là kịch bản tôi đã cố gắng để sử dụng trong vỏ:

for(var c = db.Listing.find(); c.hasNext();) { 
    var listing = c.next(); 
    db.Listing.update({ LowerCaseAddress: listing.Address.toLowerCase() }); 
} 

Nó chạy cho ~ 6 giờ và sau đó máy tính của tôi bị rơi. Có cách nào tốt hơn để thêm một thuộc tính mới cho mỗi tài liệu trong một bộ sưu tập lớn (~ 4 triệu bản ghi) không?

+0

Dường như bạn đang thiếu một số thông số trên bản cập nhật - bạn không có một tiêu chí để nó có thể cố gắng để cập nhật tất cả ghi lại trên mỗi lần lặp của vòng lặp. (Tôi không thực sự chắc chắn cách thức mong muốn hành xử nếu bạn không đặt tiêu chí cập nhật) –

+0

javascript ở đây không hoạt động. Hãy xem câu trả lời của Sid Burn. Ngoài ra, nếu bạn phải cập nhật rất nhiều và rất nhiều tài liệu, bạn có thể muốn làm điều đó theo lô để tránh khóa và có một trạm kiểm soát tiến bộ trong trường hợp một cái gì đó không thành công. –

Trả lời

17

bạn JavaScript không hoạt động, nhưng mã bên dưới hoạt động. Nhưng không biết phải mất bao lâu cho 4 triệu bản ghi.

db.Listing.find().forEach(function(item){ 
    db.Listing.update({_id: item._id}, {$set: { LowerCaseAddress: item.Address.toLowerCase() }}) 
}) 
+0

Truy vấn này mất một lúc nhưng nó hoạt động, cảm ơn !! – Justin

1

Bạn có thể sử dụng updateMany quá này:

try { db.<collection>.updateMany({}, {$set: { LowerCaseAddress: item.Address.toLowerCase() } }); } catch(e) { print(e); }