2014-04-06 15 views
6

Tôi đã tải xuống một lượng lớn dữ liệu theo định dạng trong csv. Tôi đang sử dụng mongoimport để nhập dữ liệu vào MongoDB để xử lý. Làm thế nào để tôi nhận được ngày vào định dạng ngày được MongoDB công nhận? dữ liệuChuyển đổi thành ngày MongoDB qua mongoimport

mẫu với tiêu đề

Date, Open Price, High Price, Low Price, Last Traded Price , Close Price, Total Traded Quantity, Turnover (in Lakhs) 
04-Apr-2014,901,912,889.5,896.75,892.85,207149,1867.08 
03-Apr-2014,908,918,897.65,900,900.75,156260,1419.9 
02-Apr-2014,916,921.85,898,900.7,900.75,175990,1591.97 
+0

Bạn có thực sự có nghĩa [mongoimport] (http://docs.mongodb.org/manual/reference/program/mongoimport/) hoặc được đề cập đến một số khác dụng cụ? –

+0

Tôi có nghĩa là mongoimport. Nó hoạt động tốt nếu có một số cách nào đó tôi có thể làm điều đó sau khi nhận được nó vào Db. Hoặc nếu có cách hoàn toàn khác để đưa dữ liệu vào Db với ngày ở định dạng dễ nhận biết của nó. –

+0

Câu trả lời http: // stackoverflow này.com/a/14876386/575982 cho một câu hỏi tương tự bao gồm một lệnh mongo một dòng để chuyển đổi chuỗi thành ngày. –

Trả lời

5

Bạn về cơ bản có ba tùy chọn ở đây là mặc dù bạn có thể nhập CSV trực tiếp sử dụng mongoimport, nó không có ý tưởng làm thế nào để chuyển đổi ngày từ định dạng này.

  1. Chuyển đổi đầu vào CSV của bạn sang định dạng JSON bằng bất kỳ phương tiện. Đối với các giá trị ngày tháng, bạn có thể sử dụng biểu mẫu extended JSON syntax sẽ được công cụ này nhận ra. Kết quả JSON bạn tạo ra sau đó có thể được chuyển đến mongoimport.

  2. Viết chương trình của riêng bạn để nhập dữ liệu bằng cách đọc dữ liệu nhập CSV của bạn và thực hiện chuyển đổi chính xác.

  3. Nhập nội dung CSV như cũ, và sau đó điều chỉnh dữ liệu trực tiếp trong bộ sưu tập MongoDB của bạn bằng ngôn ngữ bạn chọn.

Một mất vào tùy chọn thứ ba sẽ được lặp kết quả và cập nhật ngày cho phù hợp:

var months = [ 
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 
]; 

db.collection.find({ },{ "Date": 1 }).forEach(function(doc){ 

    var splitDate = doc.Date.split("-"); 

    var mval = months.indexOf(splitDate[1]); 
    mval = (mval < 10) ? "0" + mval : mval 

    var newDate = new Date(splitDate[2] + "-" + mval + "-" + splitDate[0]); 

    db.collection.update(
     { _id: doc._id }, 
     { "$set": { "Date": newDate } } 
    ); 

}) 

Và đó sẽ đảm bảo những ngày bạn này sau đó được chuyển đổi sang định dạng ngày BSON đúng với các giá trị ngày trùng khớp giống nhau mà bạn mong đợi.

Cảnh giác với chuyển đổi múi giờ "cục bộ", bạn sẽ muốn lưu trữ dưới dạng thời gian UTC.

+0

Tôi nghĩ rằng tất cả các thao tác này với tháng là dư thừa. Bởi vì trong trình bao, bạn có thể thực hiện 'ngày mới' ('04 -Apr-2014 ')' và điều này sẽ cung cấp cho bạn một ISOD hợp lệ: 'ISODate (" 2014-04-04T07: 00: 00Z ")'. Nếu có, hãy kiểm tra câu trả lời của tôi. –

+1

@SalvadorDali Thực ra sẽ là múi giờ độc lập. Lưu ý giá trị giờ trong ngày bạn hiển thị. Do đó, thao tác –

+0

Nếu múi giờ rất quan trọng (tôi cho rằng nó không phải là, nếu chỉ có ngày không có thông tin thời gian), bạn chỉ có thể thay đổi múi giờ trên máy cục bộ của bạn và sau đó chạy truy vấn. Nhưng cảm ơn bạn đã cho tôi biết về các vấn đề thời gian ở mongo. Tôi không biết điều này. –

18

Theo như tôi biết, không có cách nào để thực hiện việc này với mongoimport. Tuy nhiên, điều này có thể đạt được bằng cách nhập dữ liệu và sau đó chạy tập lệnh sau (lưu ý rằng không có điểm nào của tất cả các phần mềm này với một tháng như trong tập lệnh Lunn của Neil, vì mongo có thể chuyển đổi đúng ngày của bạn bằng cách thực hiện điều này new Date('04-Apr-2014')) :

db.collName.find().forEach(function(el){ 
    el.dateField = new Date(el.dateField); 
    db.collName.save(el) 
}); 

PS Nếu múi giờ là rất quan trọng (tôi cho rằng nó không phải là, nếu chỉ có số ngày không có thông tin thời gian), bạn chỉ có thể thay đổi múi giờ trên máy tính địa phương của bạn và sau đó chạy truy vấn. (Cảm ơn Neil Lunn đã giải thích về điều này)

+0

Thật khó chịu khi mongoexport ở chế độ CSV sẽ loại bỏ thông tin kiểu như thế này! (facepalm) Về cơ bản, nó vô dụng trừ khi dữ liệu của bạn chỉ gồm các chuỗi và số. –

1

Kể từ phiên bản Mongo 3.4, bạn có thể sử dụng tùy chọn --columnsHaveTypes để chỉ định loại trường của bạn trong khi sử dụng mongoimport để nhập dữ liệu của bạn. here is the link for reference.

mẫu mongoimport cú pháp dưới đây:

mongoimport --db XYZ --collection abc --type tsv --fields id.int32(),client_name.string(),app_name.auto(),date.date() --columnsHaveTypes --file "abc.tsv" --verbose 
Các vấn đề liên quan