3

MongoDB のドキュメントに defaultdict 変数を書き込もうとしています。他のすべては正常に設定されますが、この 1 つの属性だけでなく、その奇妙なものです! 以前に何度も機能した「ドメイン」と呼ばれるかなり大きな defaultdict を設定しています。この端末出力を確認してください。

だからここに私のdefaultdictがあります:

>>> type(domains) 
<type 'collections.defaultdict'>

そのかなり大きい、約 3 MB:

>>> sys.getsizeof(domains)
3146008

設定するドキュメントは次のとおりです。

>>> db.AggregateResults.find_one({'date':'20110409'}).keys()
[u'res', u'date', u'_id']

そのドキュメントの ID を取得しましょう。

>>> myID = db.AggregateResults.find_one({'date':'20110409'})['_id']
>>> myID
ObjectId('50870847f49a00509a000000')

よし、属性を設定しましょう:

>>> db.AggregateResults.update({'_id':myID}, {"$set": {'domains':domains}})
>>> db.AggregateResults.find_one({'date':'20110409'}).keys()
[u'res', u'date', u'_id']

え?貯まらない??

うーん...何かが保存されますか?

>>> db.AggregateResults.update({'_id':myID}, {"$set": {'myTest':'hello world'}})
>>> db.AggregateResults.find_one({'date':'20110409'}).keys()
[u'myTest', u'res', u'date', u'_id']

わかりました...それで問題なく保存できます...おそらくMongoDBがdefaultdictsを好まないからでしょうか? やってみよう:

>>> myDD = defaultdict(int)
>>> myDD['test'] = 1
>>> myDD
defaultdict(<type 'int'>, {'test': 1})
>>> db.AggregateResults.update({'_id':myID}, {"$set": {'myDD':myDD}})
>>> db.AggregateResults.find_one({'date':'20110409'}).keys()
[u'myTest', u'res', u'date', u'myDD', u'_id']

したがって、defaultdictsをうまく保存できますが、これだけではありませんか??

とても奇妙!なぜ何かアイデアはありますか??

safe=True で編集:

>>> db.AggregateResults.update({'_id':myID}, {"$set": {'domains':domains}}, safe=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/site-packages/pymongo-2.1.1_-py2.6-linux-x86_64.egg/pymongo/collection.py", line 405, in update
    _check_keys, self.__uuid_subtype), safe)
  File "/usr/lib64/python2.6/site-packages/pymongo-2.1.1_-py2.6-linux-x86_64.egg/pymongo/connection.py", line 796, in _send_message
    return self.__check_response_to_last_error(response)
  File "/usr/lib64/python2.6/site-packages/pymongo-2.1.1_-py2.6-linux-x86_64.egg/pymongo/connection.py", line 746, in __check_response_to_last_error
    raise OperationFailure(error["err"], error["code"])
pymongo.errors.OperationFailure: not okForStorage

この GoogleGroup のディスカッションでは、キーにピリオドが含まれていることが原因である可能性があると述べていますが、次のようになります。

>>> [x for x in domains.keys() if '.' in x]
[]
4

2 に答える 2

4

あはは!それを見つけた!

MongoDBのキーに「。」を含めることができないだけでなく、「$」を含めることもできません。

見る:

>>>[x for x in domains.keys() if '$' in x]
['$some_key_']
于 2012-10-25T19:22:53.717 に答える
0

大きすぎるドキュメントを保存しようとしていると思います。MongoDB では、すべてのドキュメントに最大 16MB のサイズが課されます。

パラメーターを指定して update コマンドを実行してみてくださいsafe=True。これはセーフ モードで実行され、試行された挿入の結果を返すようにデータベースに指示します。

于 2012-10-25T19:05:29.997 に答える