2012-10-25 3 views
3

내 MongoDB의 문서에 defaultdict 변수를 쓰려고합니다. 그 밖의 모든 것들은 훌륭합니다. 단지이 속성이 아닙니다. 기괴합니다! 나는 '도메인'이라고 불리는 다소 큰 defaultdict를 설정하고 있습니다.

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

그것의 꽤 큰, 약 3MB :

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

>>> sys.getsizeof(domains) 
3146008 

여기에 우리가 그것을 설정합니다 문서의

그래서 여기 내 defaultdict의 :이 단자 출력을 확인

해당 문서의 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'] 

그래서 이걸 저장하지 않아도 괜찮습니까?

이상해! 어떤 아이디어? 와

EDIT 진정한 = 안전 :

>>> 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 그 때문에 키에은 마침표를 데 수 말한다 :하지만,

>>> [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가 넘었으므로 OK 여야합니다. 그러나 safe = True를 사용할 때 오류가 있지만 그다지 구체적이지 않습니다. 위의 편집을 참조하십시오. – LittleBobbyTables

+0

지금 알았습니다. 걱정 마세요 :) – LittleBobbyTables