2010-02-28 4 views
3

findandupdate 쿼리를 실행할 수 없게 만드는 pymongo (또는 적어도 설명서)에 버그가 있다고 생각합니다.pymongo : findandmodify - "no such command"가 반환됩니다.

다음과 같은 현상이 발생합니다. 내가 실행하면 실제로 서버로 전송됩니다

result = db.command({ 
     'findandmodify': 'my_collection', 
     'query': {'foo': 'bar'}, 
     'update': {'$set': {'status': 'queued'}}, 
    }) 

쿼리은 : query 인수가 처음이며, findandmodify입니다

{ 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } 

하는 것으로.

하지만이 던져 서버를 발생합니다

OperationFailure: command { 'query': {'foo': 'bar'}, 'findandmodify': 'my_collection', … } failed: no such cmd

서버 (BSON의 dicts 분명히, 주문이다) findandmodify가 먼저 기대 때문입니다.

이 문제가 해결 되었습니까?

+0

당신은 실행중인 몽고의 버전은 무엇? –

+0

파이썬'dict'에는 본질적인 순서가 없기 때문에 "첫 번째"와 "두 번째"에 대한 언급은 파이썬 언어의 맥락에서 간단합니다. 명확히하십시오! –

+0

@ 로버트 : 버전 1.3.3 –

답변

6

내장 된 정렬 된 dict 유형이없는 언어의 경우 mongo 드라이버에 하나가 포함됩니다. 파이썬에서는 SON 타입입니다 : http://api.mongodb.org/python/1.4%2B/api/pymongo/son.html. 모든 명령에이 명령을 사용해야합니다.

여전히 실패하는 경우 findandmodify가 새로운 기능이므로 최신 버전의 데이터베이스를 사용하고 있는지 확인하십시오.

+0

아, 그게 효과가있을 것 같습니다. 고마워요. –

+2

"현재 (빌드)"URL http://api.mongodb.org/python/current/api/bson/son.html –

+0

에 대한 링크 : https://github.com/mongodb/mongo-python-driver /blob/master/pymongo/collection.py#L1384 – Pablojim

2

한 가지 해결 방법은 명령의 JavaScript 버전을 구성하여 db.eval()에 전달하는 것입니다.

db.eval('db.runCommand({"findandmodify": "my_collection", "query": {"foo": "bar"}, "update": {"$set": {"status": "queued"}},})') 

문제는 알렉스가 언급 한 바와 같이 더 또는 덜 수동으로 문자열을 구축 할 필요가 있으므로, 파이썬 dicts, 아니 순서가없는 것입니다.

+0

Javascript 객체는 본질적인 순서가 없습니다 (언어 표준에 따라 특정 JS 구현에는 물론 자유롭게 임의의 1 점을 추가 할 수 있지만 보장되지 않습니다!). –

+0

jS 표준에서는 순서가 정의되지 않았지만 대부분의 구현에서는 요소를 개체에 추가하는 순서를 유지합니다. 두 경우 모두이 예제는 Mongo의 인터프리터에서 올바르게 작동합니다. –

1

참조 PyMongo 설명서를 더 참조 :

참고 명령 문서에서 키의 순서가 중요하다을합니다 (이 "동사"와야합니다 여러 키 (예 : findandmodify)를 필요로하는 명령은 SON 또는 문자열의 인스턴스를 사용해야하며 Python dict 대신 kwargs 을 사용해야합니다.

http://api.mongodb.org/python/2.1/api/pymongo/database.html

관련 문제