2012-10-25 50 views
3

我想寫一個defaultdict變量到我的MongoDB中的文檔。其他一切都設置好,只是不是這一個屬性,它的奇怪!我設置了一個相當大的名爲'域'的defaultdict,它曾經工作過很多次。看看這個端子輸出:

因此,這裏是我的defaultdict:

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

它相當大,大約3MB:

>>> 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'] 

EH?它沒有保存?

嗯...做任何事情都可以保存嗎?

>>> 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罰款,而不是這個?

太奇怪了!任何想法爲什麼?

編輯與安全= 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 

This GoogleGroup discussion說,可能是由於在按鍵有fullstops,但:

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

我試圖通過這個運行的代碼(或過程中,我並沒有複製/粘貼代碼給它關閉測試)和它的所有工作對我來說,我不知道是什麼發生在你的嘗試。 – ACE

+0

現在明白了,不用擔心:) – LittleBobbyTables

回答

4

啊哈!找到了!

不僅MongoDB中的密鑰不能有'。',他們也不能有'$'。

參見:

>>>[x for x in domains.keys() if '$' in x] 
['$some_key_'] 
0

我的猜測是,你正在試圖挽救過大的文件。 MongoDB在其所有文檔上都加上了16MB的最大大小。

嘗試使用參數safe=True運行更新命令。這將以安全模式運行,這將指示數據庫發送嘗試插入的結果。

+0

我做了sys.getsizeof,它剛剛超過3MB,所以應該沒問題。但是,使用safe = True時出錯,但它不是很具體 - 請參閱上面的編輯:) – LittleBobbyTables

+0

現在明白了,不用擔心:) – LittleBobbyTables