2012-11-08 2 views
1

getLastError에 문서가 업데이트되었을 때 업데이트되지 않는 이유는 무엇입니까?MongoDB의 getLastError가 문서를 업데이트하지 못했음을 나타냅니다.

> db.contacts.find() 
{ "_id" : ObjectId("509b60e7c546b6dc73f57877"), "name" : "mike" } 
> db.contacts.update({}, {name: 'peter'}) 
> db.runCommand({getLastError: 1}) 
{ "n" : 0, "connectionId" : 3188, "err" : null, "ok" : 1 } 
> db.contacts.find() 
{ "_id" : ObjectId("509b60e7c546b6dc73f57877"), "name" : "peter" } 

getLastError이 문서가 명확하게 업데이트에도 불구하고, n: 0을 반환합니다. updatedExisting 필드도 누락되었습니다. 저는 이것을 샘플 MongoHQ 데이터베이스에서 원격으로 실행하고 있습니다. 내 로컬 MongoDB의 인스턴스에 대해

실행, getLastError가 올바르게를 반환

> db.runCommand({getLastError: 1}) 
{ 
    "updatedExisting" : true, 
    "n" : 1, 
    "connectionId" : 1, 
    "err" : null, 
    "ok" : 1 
} 
+1

2.2 버전의 Mongo 셸을 2.2 데이터베이스와 함께 사용하면이 문제가 저에게 나타납니다. 2.2 또는 2.2.1 버전의 쉘로 실행할 수 있습니까? – MrKurt

답변

2

이 연결 재사용에 문제가있을 수 있습니다 또는 쉘의 행동이 될 수 있습니다. getLastError (GLE) 호출은 GLE 호출을 실행하는 연결에서 마지막으로 수행 된 작업의 상태를 반환합니다.

그러나 쉘을 사용하면 모든 쓰기 작업 후에 GLE가 자동으로 호출되므로 GLE가 이미 호출 되었기 때문에 일반적으로 null 결과를 얻습니다. 대신 getPrevError()에 전화를 걸어보세요. 예상 한 결과가 나오는지 확인하십시오.

MongoDB 드라이버는 연결이 풀로 반환되기 전에 GLE이 호출되었는지 확인하고 이러한 종류의 문제를 피하기 위해 작업의 결과 (또는 오류)로 반환됩니다.

+1

+1. 대부분 위의 문제의 원인. –

+0

감사합니다. MongoHQ를 사용할 때 클라이언트와 MongoDB 인스턴스 사이에 레이어가 있다는 것을 깨닫지 못했습니다. 그리고 내가 알았 더라면, 나는 같은 쉘 세션 내에서 풀과 다른 연결을 얻을 수 있다고 짐작하지 못했을 것이다. 나는이 질문을 하루 또는 이틀 동안 열어 두어 내가 그것을 검증 할 수 있는지, 혹은보다 확실한 답을 얻을 수 있는지 알아볼 것이다. –

+1

MongoHQ와 Mongo 사이에 실제로 레이어가 없기 때문에 아마도 올바르지 않을 것입니다. – MrKurt

관련 문제