2014-04-06 2 views
6

나는 거대한 덩어리를 csv 형식으로 다운로드했습니다. mongoimport를 사용하여 MongoDB에 데이터를 입력하여 처리합니다. MongoDB에서 인정하는 날짜 형식으로 날짜를 얻으려면 어떻게해야합니까? 헤더날짜로 변환 MongoDB 통해 mongoimport

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

가 실제로 의미합니까 [mongoimport] (http://docs.mongodb.org/manual/reference/program/mongoimport/) 또는 다른 언급하는 수단? –

+0

나는 mongoimport를 의미한다. 그게 괜찮 으면 어쩌면 내가 그것을 Db에 넣은 후에 할 수있다. 또는 데이터를 인식 할 수있는 형식으로 날짜와 함께 데이터를 가져 오는 완전히 다른 방법이있는 경우 –

+0

이 답변은 http : // stackoverflow입니다.com/a/14876386/575982 비슷한 질문에 문자열을 날짜로 변환하는 한 줄 mongo 명령이 포함됩니다. –

답변

5

샘플 데이터 당신은 기본적으로 직접 mongoimport를 사용하여 CSV를 가져올 수 있습니다 것처럼, 그것은이 형식에서 날짜를 변환하는 방법을 모르고있다 여기에 세 가지 옵션이 있습니다.

  1. 무엇이든간에 CSV 입력을 JSON 형식으로 변환하십시오. 날짜 값의 경우 도구에서 인식 할 extended JSON syntax 양식을 사용할 수 있습니다. 생성 된 JSON을 mongoimport로 전달할 수 있습니다.

  2. CSV 입력을 읽고 올바른 변환을 수행하여 데이터를 가져 오기위한 프로그램을 직접 작성하십시오.

  3. CSV 콘텐츠를 그대로 가져온 다음 선택한 언어를 사용하여 MongoDB 컬렉션에서 직접 데이터를 조작하십시오. 세 번째 옵션에

한 테이크는 루프에 결과가 될 따라 날짜를 업데이트 할 것입니다 :

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 } } 
    ); 

}) 

을 그리고 그 날짜가 다음과 올바른 BSON 날짜 형식으로 변환되어 있는지 확인하십시오 것 예상되는 것과 일치하는 날짜 값.

"로컬"표준 시간대 변환에주의하면서 UTC 시간으로 저장하려고합니다.

+0

나는이 모든 조작을 몇 달 동안 할 필요가 없다고 생각한다. 쉘에서는 다음과 같은'new Date ('04 -Apr-2014 ')'를 할 수 있기 때문에 유효한 ISODate를 얻을 수 있습니다 :'ISODate ("2014-04-04T07 : 00 : 00Z")'. 내 대답을 확인하십시오. –

+1

@SalvadorDali 사실 그것은 시간대에 독립적입니다. 표시 한 날짜의 시간 값을 확인하십시오. 따라서 조작 –

+0

시간대가 너무 중요하다면 (시간 정보가없는 날짜 만있는 경우), 로컬 컴퓨터에서 시간대를 변경 한 다음 쿼리를 실행할 수 있습니다. 그러나 mongo의 시간 문제에 대해 저에게 보여 주셔서 감사합니다. 나는 이것을 몰랐다. –

18

내가 아는 한, mongoimport으로이를 수행 할 방법이 없습니다.

그러나 이것은 데이터를 가져온 다음 Neil의 Lunn 스크립트에서와 같이이 모든 세부 사항을 가리킬 필요가 없습니다. mongo는 new Date('04-Apr-2014')을 사용하여 날짜를 올바르게 변환 할 수 있습니다. : 시간대 (시간 정보가없는 경우에만 날짜가있는 경우 나, 그렇지 않은 가정) 그렇게 중요하다면, 당신은 당신의 로컬 컴퓨터에 시간대를 변경 한 다음 쿼리를 실행할 수 있습니다

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

PS. (이에 대한 명확한 설명을 위해 닐 룬 덕분에)

+0

CSV 모드의 mongoexport가 이런 종류의 정보를 버리는 것은 너무 짜증나! 기본적으로, 귀하의 데이터가 단지 문자열과 숫자로 구성되어 있지 않으면 쓸모가 없습니다. –

1

몽고 버전 3.4로, 당신은 당신의 데이터를 가져 mongoimport를 사용하는 동안 필드의 유형을 지정 --columnsHaveTypes 옵션을 사용할 수 있습니다. 아래 here is the link for reference.

샘플 mongoimport 구문 :

mongoimport --db XYZ --collection abc --type tsv --fields id.int32(),client_name.string(),app_name.auto(),date.date() --columnsHaveTypes --file "abc.tsv" --verbose