2012-11-12 3 views
3

내가 내 코드에서 다음을 수행해야합니다 텍스트 파일에서Json으로 읽은 후 Python을 사용하여 MongoDB에 삽입 할 텍스트 파일의 "날짜"형식은 무엇입니까?

  • 읽기 데이터를
  • 가 MongoDB를로 데이터 Upsert JSON
  • 로 데이터를 변환을
  • 여기

은 예입니다 텍스트 파일의 내용이 표시되는 방식에 대한 설명 :

{ 
    "S": "someString" <- Type String when inerted in mongodb 
    "N": 123   <- Type Int32 
    "F": 12.3   <- Type Double 
    "D": ?   <- Need to be Type DateTime when inerted in mongodb 
} 

나는 "?"의 위치에 가지고 있다고 생각하는 것입니다. 그래서 파이썬에서 bson.json_util.loads 함수를 사용하면 텍스트 파일을 나중에 mongoDB에 삽입 할 수있는 Json으로 변환 할 수 있습니다. 누군가가 파일을 포맷하는 방법의 예를 줄 수있는 경우

with open('data.txt') as f: 
    data = json_util.loads(f.read()) 
    db[dbName][colName].update({'_id': id}, data, upsert=True,safe=True) 

내가 그것을 감사하겠습니다 : 여기

부하 및 삽입을 수행하는 코드이다. (예를 들어 "바이너리"또는 "코드"와 같은 더 복잡한 Bson 유형이 포함 된 경우에도 유용 할 수 있습니다.)

답변

9

Mongo의 datetimes 표현은 {"$date": number-of-milliseconds-since-epoch}입니다. 당신의 예에서 : 몽고에 기록 할 때

{ 
    "S": "someString", 
    "N": 123, 
    "F": 12.3, 
    "D": {"$date": 1352540684243} 
} 

D는 날짜 필드를 생성합니다.

the documentation for mongo json extensions을 참조하십시오.

당신은 쉽게 자신의 확장 프로그램 json_util을 확장 할 수 있습니다 예를 들어, ISO 형식의 날짜 시간에 대한 :

import json, dateutil.parser, bson.json_util 

a = """{ 
    "mydate": {"$isodate": "2012-11-01T20:19:55.782Z"} 
}""" 

def my_hook(dct): 
    if '$isodate' in dct: 
     return dateutil.parser.parse(dct['$isodate']) 
    return bson.json_util.object_hook(dct) 

obj = json.loads(a, object_hook=my_hook) 
+0

고마워, 나는 실제로 그 문서를 읽고 답을 읽기 전에 해본 적이있다.하지만 나는이 datetime과 같은 ISO 표준 문자열을 사용하는 $ datetime과 같은 것을 주로 찾고 있었다. "2012 -11-11Z "} 나는 아무도 없다는 사실에 매우 실망합니다! 날짜에 대한 에포 키 이후의 수 밀리 초를 갖는 텍스트 파일을 보는 것은 정말로 편리하지 않습니다! –

+0

@IdaN : 그렇습니다. 그런 것은 없지만 쉽게 추가 할 수 있습니다. 업데이트를 확인하십시오. – georg

+0

와우 감사합니다 :) 당신은 나보다 앞서 한발 앞서 있습니다! 사실 custom 인코더 클래스를'load (fp, cls = None, object_hook = None, parse_float = None, parse_int = None, parse_constant = None, object_pairs_hook = None, ** kw)로 전달하려고 생각하고있었습니다.'나는 figuer 내가 어떻게 할 수 있는지 알아봐! –

0

JSON은 날짜에 대해 아무 것도 모릅니다. 직렬화 및 비 직렬화 표준 형식. MongoDB에 문자열로 저장 될 것이므로, 파이썬 코드에서 strftime과 strptime을 호출 할 때 동일한 형식 문자열을 사용해야합니다.

+0

이 문서 (http://api.mongodb.org/python/2.3/을 바탕으로 json_util # bson.json_util) json_util을 사용하여 특별한 BSON 유형을 사용하는 경우에도 BSON 문서를 JSON으로 인코딩/디코딩 할 수 있어야합니다. 아직 방법을 알지 못했습니다. –

+0

죄송합니다. 질문을 잘못 이해했습니다. 나는 bsonspec.org를 보았을 때 숀이 타임 스탬프를 가지고 올바른 아이디어를 가지고 있다고 생각한다. – BenTrofatter

+0

문제 없습니다 :) 어쨌든 시간 내 주셔서 감사합니다. –

0

왜 타임 스탬프를 사용하지 않을까요? 그것들은 작업하기가 매우 쉽고 실제 프로그램 코드 외에도 특별한 특수 처리가 필요하지 않으며 쉽게 정수로 남겨 둘 수도 있습니다. 나는 형식 문자열을 다뤘다. 그리고 그들이 언제나 똑같은지 확인하는 좋은 방법이 아니기 때문에 가능할 때마다 타임 스탬프를 사용하는쪽으로 옮겼다.

+0

좋은 지적입니다, 션. 실제로, bsonspec.org를 보면, 그들이 가지고있는 날짜/시간 데이터 타입은 표준 utc 타임 스탬프를 나타내는 단지 64 비트 int입니다. – BenTrofatter

+0

제안 해 주셔서 감사합니다. 나는 새로 시작하는 경우 timestamp를 사용하겠다는 아이디어를 채택했을 것입니다. 그러나 제 경우에는 이미 "DateTime"유형의 데이터가 들어있는 기존 mongo 콜렉션에 데이터를 삽입하고 콜렉션을 C# 코드로 사용하고 있습니다. DateTime을 예상하는 aC# 클래스에 매핑!그래서 그것은 약간 complected이고 나는 형식으로 붙어있다! –