web-dev-qa-db-ja.com

pythonオブジェクトをシリアル化せずにmongoDBに直接保存する方法はありますか?

pythonオブジェクト(より具体的には辞書)をBSONを使用してMongoDBにバイナリとして保存できることをどこかで読みましたが、現在、これに関連するドキュメントは見つかりません。

誰かがこれをどのように正確に行うことができるか知っていますか?

13
chiffa

オブジェクトをシリアル化せずにファイル(データベース)に格納する方法はありません。データをあるプロセスから別のプロセスまたは別のサーバーに移動する必要がある場合は、送信するために何らかの形式でシリアル化する必要があります。 MongoDBについて質問しているので、データはMongoDBデータベースに格納するために、何らかの形式で絶対にシリアル化されます。 MongoDBを使用する場合、それは [〜#〜] bson [〜#〜] です。

より生の形式のPythonオブジェクトをMongoDBドキュメントに格納する方法があるかどうかを実際に尋ねている場合は、Binaryフィールドをに挿入できます。必要なデータを含めることができるドキュメント。その形式で直接クエリを実行することはできないため、MongoDBなどのNoSQLドキュメントデータベースを使用することの多くの利点が失われる可能性があります。

>>> from pymongo import MongoClient
>>> client = MongoClient('localhost', 27017)
>>> db = client['test-database']
>>> coll = db.test_collection    
>>> # the collection is ready now 
>>> from bson.binary import Binary
>>> import pickle
>>> # create a sample object
>>> myObj = {}
>>> myObj['demo'] = 'Some demo data'
>>> # convert it to the raw bytes
>>> thebytes = pickle.dumps(myObj)
>>> coll.insert({'bin-data': Binary(thebytes)})
34
WiredPrairie

あなたがmongoDBに特に興味がないと仮定すると、おそらくBSONを探していません。 BSONは、JSONとは異なるシリアル化形式であり、速度とスペース効率を高めるように設計されています。一方、pickleは、pythonオブジェクトの直接エンコーディングを行います。

ただし、pickleを採用する前に速度テストを実行して、ユースケースに適していることを確認してください。

4
superdud