2015-01-06 2 views
1

2 년 전에 MongoDB 2.2로 작성한 Opa (https://github.com/MLstate/opalang) 앱은 MongoDB를 2.4로 마이그레이션 할 때 생존했습니다. 불행히도 DB 쿼리는 MongoDB 2.6에서 더 이상 제대로 작동하지 않습니다.OpaLang : 쿼리에서 MongoDB 2.6의 제한을 준수하지 않는 한도

버전 확인 :

  • 2.6.5 - 공식적으로 오파 지원은 이후 "[version] bumped MongoDb to 2.6.5을"커밋,
  • 2.6.6 - 최신 안정,
  • 2.6 - 최신 - 야간 2014년 5월 1일,
  • 2.8.0-rc4 - 최신 개발.

단순화 작업 예 :

type Article.t = { 
    int id 
} 
database nadzieja_test { 
    Article.t /article[{id}] 
} 
module Model { 
    function get_articles() { 
    /nadzieja_test/article[limit 2].{id} 
    |> DbSet.iterator 
    |> Iter.to_list 
    |> List.mapi(function(i, item) { 
     s = "get_articles()#{i}: id={item.id}" + "\n" 
     jlog(s) 
     s 
    }, _) 
    } 
} 
function page() { 
    [1,2,3,4,5,6,7,8,9] 
    |> List.iter(
    function (id) { 
     /nadzieja_test/article[{~id}] = {~id} 
    }, _) 
    <pre>{Model.get_articles()}</pre> 
} 
Server.start(Server.http, { title: "Test", ~page }) 

쿼리 [limit 2] 반환 모든 문서.

실생활 문제는 분명히 더 복잡해졌지만 (문서 저장과 쿼리 모두) 동일한 결과가 나타납니다. 원본 컬렉션은 인덱스를 사용했지만 삭제하면 문제가 제거되지 않았습니다.

테스트 전에 데이터베이스와 컬렉션이 존재하지 않았습니다. 으로 mongo 콘솔에서 프로파일 링을 활성화하는 것을 보았습니다 (프로파일 링이 활성화되고 비활성화 된 상태에서 테스트되었습니다).

> db.system.profile.find({"op":"query","ns":"nadzieja_test.article"}).sort({ts:-1}).pretty() 
{ 
    "op" : "query", 
    "ns" : "nadzieja_test.article", 
    "query" : { 

    }, 
    "cursorid" : 152008290160, 
    "ntoreturn" : 2, 
    "ntoskip" : 0, 
    "nscanned" : 2, 
    "nscannedObjects" : 2, 
    "keyUpdates" : 0, 
    "numYield" : 0, 
    "lockStats" : { 
     "timeLockedMicros" : { 
      "r" : NumberLong(278), 
      "w" : NumberLong(0) 
     }, 
     "timeAcquiringMicros" : { 
      "r" : NumberLong(11), 
      "w" : NumberLong(8) 
     } 
    }, 
    "nreturned" : 2, 
    "responseLength" : 88, 
    "millis" : 0, 
    "execStats" : { 
     "type" : "PROJECTION", 
     "works" : 3, 
     "yields" : 0, 
     "unyields" : 0, 
     "invalidates" : 0, 
     "advanced" : 2, 
     "needTime" : 0, 
     "needFetch" : 0, 
     "isEOF" : 0, 
     "children" : [ 
      { 
       "type" : "COLLSCAN", 
       "works" : 3, 
       "yields" : 0, 
       "unyields" : 0, 
       "invalidates" : 0, 
       "advanced" : 2, 
       "needTime" : 1, 
       "needFetch" : 0, 
       "isEOF" : 0, 
       "docsTested" : 2, 
       "children" : [ ] 
      } 
     ] 
    }, 
    "ts" : ISODate("2015-01-06T11:05:26.170Z"), 
    "client" : "127.0.0.1", 
    "allUsers" : [ ], 
    "user" : "" 
} 

공지 사항이 모두 ntoreturnnreturned 가치 2을 가지고 얻은 결과를 프로파일 링. 나는이 Opa 또는 Mongo 문제인지 확신 할 수 없다. DB에서 모든 문서를 가져오고 클라이언트 쪽 (많은 문서)을 필터링하는 다른 해결 방법은 환영합니다!

+0

프로필 출력에 표시된 쿼리가 어떻게 든 두 개 이상의 문서를 반환한다고 말하는 것입니까? – JohnnyHK

+0

예, 'limit' 키워드가없는 것처럼 모든 문서를 반환합니다. –

+0

MongoDB 셸에서 문제를 재현 할 수 있습니까? 질문하기 전에 오페라에 대해 들어 보지 못했을 것입니다. – JohnnyHK

답변

관련 문제