2013-02-13 23 views
5

Dường như trong một thời gian tôi đã lưu trữ số thập phân của mình dưới dạng chuỗi. Đây là một vấn đề bởi vì tôi cần bắt đầu sử dụng khung tổng hợp để thực hiện một số phép tính.Mongo chuyển đổi tất cả các trường số được lưu trữ dưới dạng chuỗi

Có cách nào để đi bộ mỗi tài liệu trong bộ sưu tập của tôi và kiểm tra từng giá trị cho isNaN, và nếu sai, lưu trữ nó với parseFloat

Trả lời

6

Something như thế này nên làm việc từ vỏ Mongo:

db.yourCollection.find({}).forEach(function(doc) { 
    if(isNaN(doc.xyz)) { 
     print('found string: ' + doc._id); 
     db.yourCollection.update( 
      { _id: doc._id}, 
      { $set : { "xyz" : parseFloat(doc.xyz) } } 
     ) 
    } 
}) 

Nó lặp qua từng tài liệu, sử dụng isNaN như bạn đã đề xuất, sau đó $sets giá trị cho giá trị parseFloat cho tài liệu hiện tại.

+1

Theo mongodb 2.2, bản cập nhật sẽ lấy truy vấn làm thông số đầu tiên, vì vậy {_id: doc._id} thay vì chỉ doc._id. –

+0

Thay vì 'isNaN (doc.xyz)', bạn nên sử dụng 'typeof doc.xyz == 'string'' nếu chuỗi của bạn là" 123 "hoặc" 3456 ". – ov1d1u

+1

@ ov1d1u - Câu hỏi ban đầu tuy nhiên được hỏi cụ thể về cách sử dụng 'isNaN', vì vậy tôi đã chọn nó. – WiredPrairie

2

Cảm ơn bạn đã trả lời. Tôi đã không rõ ràng trong câu hỏi ban đầu của tôi trong đó tôi không muốn phải xác định các lĩnh vực để cập nhật các con số, mà là đi bộ mỗi tài sản và thực hiện kiểm tra.

tôi đã đặt cùng chức năng này ít để làm các trick:

var cursor = db.results.find(); 
while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    for (key in doc) { 
     if (key.match(/^metric_.*/i) && !isNaN(doc[key])) { 
      doc[key] = parseFloat(doc[key]); 
      db.results.update({ _id : doc._id }, doc); 
     } 
    } 
} 

Hai điều cần lưu ý:

  1. này chỉ thực hiện việc kiểm tra và chuyển đổi sang cấp độ đầu tiên của tài sản. Nó có thể dễ dàng sửa đổi để đi sâu hơn, nhưng đây là tất cả những gì tôi cần vào lúc này.
  2. Chức năng này sẽ làm nổ các giá trị ngày của bạn! Ngày javascript được đánh giá bởi isNaN là sai và do đó sẽ được coi là số. Trong trường hợp của tôi, việc sử dụng parseFloat sẽ thực sự đặt giá trị thành isNaN. Một lần nữa, một sửa chữa rất dễ dàng cho người xem, nhưng tôi chỉ muốn cung cấp tuyên bố từ chối trách nhiệm đó.

Hy vọng điều này sẽ giúp người khác ở vị trí của tôi.

Các vấn đề liên quan