2014-01-18 8 views
2

배열의 속성에 대한 복합 색인이있는 콜렉션이 있습니다. 내가 실행 해요 쿼리는 다음과 같습니다몽고 집계가 0을 반환합니다.

db.servers.find({$query: { features: {$elemMatch: {'name':'a','status':'passed'}}}}).count() 

유효한 숫자를 반환하는 데 사용이 쿼리를,하지만 난 COUNT() 명령을 제거하면 지금은 0을 반환, 나는 일치의 긴 목록을 가져옵니다.

문제는 여기 - MongoDB's count() incorrectly returns 0 if a query is given

지금까지 내가 다시 시작하려 한 일, 업데이트, repaireDatabase를 실행 색인화를 실행 dropIndexes를 실행하고 몽구스 나를 위해 인덱스를 생성시키는, 그리고 mongodump 및 mongorestore을 실행하는 것과 비슷하다 . 저널링을 사용하고 있기 때문에 --repair 플래그로 mongod를 실행할 수 없었습니다. 이 같은 경고 수백 줄의 로그에 있습니다

파일 -

경고 : ClientCursor는 :: 수율을 잠금 해제 할 수없는/재귀 잠금 NS의 C B : 상단 zrk.servers : {OPID : 26, 활성 : true, secs_running : 9, op : "쿼리", ns : "zrk", 쿼리 : {repairDatabase : 1.0} 클라이언트 : "127.0.0.1:49917", desc : "conn1", threadId : 0, lock : {^ : "W"}, waitingForLock : false, numYields : 0, : 0, w : 2}}}

처음에는이 mongod를 복제 세트로 시작했지만 아직 보조 멤버를 추가하지 않았습니다. 데이터 디렉토리와 서버는 별도의 EBS 볼륨에 있습니다.

편집 : 문제는 데이터베이스가 손상된 것으로 생각하여 수동으로 모든 문서를 새로운 mongo로 이동했습니다. 위의 링크에서 같은 문제가 해결되었지만 해결되지 않았습니다.

오래된 빈 글자의 색인을 제거하고 하나 또는 두 개의 문서를 추가하여 다시 쿼리를 실행 해 보았습니다. 그것은 어느 쪽도 일하지 않았다. non-id 색인은

{ 
       "v" : 1, 
       "key" : { 
         "features.name" : 1, 
         "features.status" : 1, 
         "random" : 1 
       }, 
       "ns" : "zrk.servers", 
       "name" : "features.name_1_features.status_1_random_1", 
       "background" : true, 
       "safe" : null 
     } 

입니다. 보시다시피, 저는이 색인을 사용하여 임의의 문서를 선택합니다. 그러나 위의 찾기 쿼리에도 사용됩니다.

+0

재미있는 버그. mongo 쉘을 사용하여 해당 쿼리를 실행할 수 있습니까? db 문제인지 node.js 드라이버 문제인지 확인하는 것이 도움이 될 것입니다. – 3rf

+1

@ 3rf가 맞으면 찾기 문서에서 $ query {}를 제거해야합니다. –

답변

4

나는 당신의 쿼리에서 "$ query"를 사용하고있는 것이 문제라고 생각합니다. find 명령의 일부로 "$ query"를 사용하는 것은 더 이상 필요하지 않으며, 설명서에 따라 prevents cursor helpers from working. 쿼리를 다음과 같이 다시 작성하십시오.

db.servers.find({features:{$elemMatch:{'name':'a','status':'passed'}}}) 

.count()가 작동하는지 확인하십시오.

+2

커서 도우미를 "방지"하는 것은 그리 많지 않습니다. 명령 또는 쿼리를 공식화하는 두 가지 다른 방법이며이를 혼합 할 수 없습니다. DBQuery가 평가되기 전에 커서에 추가 된 count() 메소드가 다른 것으로 변환됩니다. –

관련 문제