3

コードで次のことを行う必要があります。

  • テキストファイルからデータを読み取る
  • データをJsonに変換します
  • データをMongoDBにアップサートします

テキストファイルのコンテンツがどのように表示されるかの例を次に示します。

{
   "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
}

「?」の代わりに何を持っているのかわかりません。そのため、Pythonでbson.json_util.loads関数を使用すると、テキストファイルをJsonに適切に変換でき、後でmongoDBに挿入できます。

ロードと挿入を行うコードは次のとおりです。

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

誰かがファイルのフォーマット方法の例を教えていただければ幸いです。(例に「binary」や「code」タイプなどのさらに複雑なBsonタイプを含めることができる場合は、これも便利です:))

4

3 に答える 3

9

Mongo の日時の表現は{"$date": number-of-milliseconds-since-epoch}. あなたの例では:

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

Dmongo への書き込み時に日時フィールドを生成します。

mongo json extensions のドキュメントを参照してください。

json_utilISO 形式の日時など、独自の拡張機能をプログラムするように簡単に拡張することもできます。

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)
于 2012-11-12T04:53:42.377 に答える
0

JSON は日付について何も知らないため、シリアル化および逆シリアル化する標準形式を決定するのはユーザー次第です。これは文字列として MongoDB に保存されるため、Python コードで strftime と strptime を呼び出すときは必ず同じフォーマット文字列を使用してください。

于 2012-11-12T04:10:33.817 に答える
0

タイムスタンプを使用しない理由。それらは非常に扱いやすく、実際のプログラムコード以外で実際に特別な処理を必要としないか、整数のまま簡単にそのままにしておくことができます。私はフォーマット文字列を扱ってきましたが、それらがどこでも同じであることを保証する良い方法は実際にはありません.

于 2012-11-12T04:21:28.443 に答える