Symfoware

Symfowareについての考察blog

MongoDB PyMongo 2.7.1で「_id」を自分で指定して、登録や検索を行う

MongoDBにPythonからPyMongoを使用して操作してみています。
PyMongo 2.7.1のインストールと使い方(チュートリアル)
MongoDB PyMongo 2.7.1 よく使う機能のまとめ

データベースの仕様上、「_id」というフィールドが自動的に付与され、
ユニークなObjectIdが設定されます。

これを自分で指定できないものか。
例えば、日付をyyyy-MM-dd形式にして_idとして使用したいとか。


ObjectIdに日付を指定



まず試してみたのは、ObjectIdを自分で作成して見る方法。
※これはうまく行きません。


  1. # -*- coding:utf-8 -*-
  2. import pymongo
  3. import bson.objectid
  4. # MongoDBに接続
  5. client = pymongo.MongoClient('192.168.1.110', 27017)
  6. db = client.mongo_test
  7. # test_collectionを取得
  8. col = db.test_collection
  9. # ObjectIdを自分で生成して登録
  10. _id = bson.objectid.ObjectId('2014-05-06')
  11. col.insert({'_id':_id, 'value':'test'})




実行すると、「bson.errors.InvalidId: 2014-05-06 is not a valid ObjectId」という
エラーが発生します。


$ python sample.py
Traceback (most recent call last):
File "sample.py", line 13, in <module>
    _id = bson.objectid.ObjectId('2014-05-06')
File "build/bdist.linux-x86_64/egg/bson/objectid.py", line 92, in __init__
File "build/bdist.linux-x86_64/egg/bson/objectid.py", line 196, in __validate
bson.errors.InvalidId: 2014-05-06 is not a valid ObjectId





どうすれば良いのか悩んだのですが、オチは簡単。
_idに文字列をそのまま指定すればOKです。


  1. # -*- coding:utf-8 -*-
  2. import pymongo
  3. # MongoDBに接続
  4. client = pymongo.MongoClient('192.168.1.110', 27017)
  5. db = client.mongo_test
  6. # test_collectionを取得
  7. col = db.test_collection
  8. # ObjectIdを自分で生成して登録
  9. _id = '2014-05-06'
  10. col.insert({'_id':_id, 'value':'test'})
  11. for doc in col.find({'_id':_id}):
  12.     print(doc)





実行すると、ちゃんと登録できたことがわかりました。


$ python sample.py
{u'_id': u'2014-05-06', u'value': u'test'}




注意点は、もう一度このプログラムを実行するとキー重複のエラーになります。


$ python sample.py
Traceback (most recent call last):
File "sample.py", line 13, in <module>
    col.insert({'_id':_id, 'value':'test'})
File "build/bdist.linux-x86_64/egg/pymongo/collection.py", line 412, in insert
File "build/bdist.linux-x86_64/egg/pymongo/mongo_client.py", line 1121, in _send_message
File "build/bdist.linux-x86_64/egg/pymongo/mongo_client.py", line 1062, in __check_response_to_last_error
pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: mongo_test.test_collection.$_id_ dup key: { : "2014-05-06" }




事前にremoveしておくか、saveを使用するようにします。


  1. # -*- coding:utf-8 -*-
  2. import pymongo
  3. # MongoDBに接続
  4. client = pymongo.MongoClient('192.168.1.110', 27017)
  5. db = client.mongo_test
  6. # test_collectionを取得
  7. col = db.test_collection
  8. # ObjectIdを自分で生成して登録
  9. _id = '2014-05-06'
  10. col.save({'_id':_id, 'value':'test'})
  11. for doc in col.find({'_id':_id}):
  12.     print(doc)




saveは_idに存在しない値を指定した場合は、insertと同じ動きになるようです。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/07/27(日) 16:04:23|
  2. MongoDB
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<MongoDB PyMongo 2.7.1でMap,Reduceのサンプル | ホーム | MongoDB PyMongo 2.7.1 よく使う機能のまとめ>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1434-6c036169
この記事にトラックバックする(FC2ブログユーザー)