2012-07-24 7 views
3

MongoDB "$ or"쿼리의 프로파일 링을 수행하려고하는데 Mongo의 'explain()'명령에 문제가 있습니다. 껍질. find 명령으로 내 쿼리를 실행하면 예상대로 작동하여 하나의 레코드가 반환됩니다.

uncaught exception: error: { "$err" : "invalid operator: $or", "code" : 10068 }

나는 다음과 같은 쿼리를 시도하고있다 : 나는 경우

db.people.find({"query" : 
        {"$or" : [ 
         {"site" : "mysite", "site_id" : "587125722"}, 
         {"user_id" : ObjectId("4fb811aae4b0b628b485a58d")} 
        ]}, 
       "$orderby" : { "global_id" : 1, "user_id" : 1} 
       }) 

를 내가에 압정 그러나, 나는 다음과 같은 오류가) (찾기의 끝에서 '() 설명' "$ or"를 "or"로 변경하면 explain()이 잘 작동하지만 쿼리는 0 개의 결과를 반환합니다. 나는 그것들이 syntax (또는)없이 동일해야한다는 인상하에 있었고, 그래서 나는 무엇을 잘못하고 있는가? 버전 2.0.4를 사용하고 있습니다. 도움을 줄 수있는 사람에게 감사드립니다.

답변

6

"쿼리"(검색을 수행 할 서버에 요청) (무엇을 검색의 사양)는 "쿼리"부분을 "쿼리"를 포장하기 위해 내부적으로 사용되는 키워드 그것을 서버에 보낸 BSON 문서 내에서 구별되게하십시오. 그러나 쉘 도우미 (예 : .explain)는이 "패키징"을 사용자가 지정하는대로 강제 실행합니다. "쿼리"자체에서 감싸서 원하는 쿼리 (직접 "쿼리"를 사용하는)를 잃게됩니다.

매트의 대답은 미리 포장 된 요청을 풀어서이 문제를 방지하며이를 수행하는 일반적인 방법입니다 ... Matt의 재 작성 끝 부분에 ".explain()"을 추가하면 예상대로 작동합니다.

형식을 유지하려는 경우 ".sort"대신 "$ orderby"와 같은 방식으로 문서에 "$ explain : true"를 추가하면됩니다. ".explain"쉘 도우미에 대한 자바 스크립트 코드에서

db.people.find({"query" : 
        {"$or" : [ 
         {"site" : "mysite", "site_id" : "587125722"}, 
         {"user_id" : ObjectId("4fb811aae4b0b628b485a58d")} 
        ]}, 
       "$orderby" : { "global_id" : 1, "user_id" : 1}, 
       "$explain" : true 
       }) 

봐이 무엇을 볼 수 있습니다 :

> db.foo.find().explain 
function (verbose) { 
    var n = this.clone(); 
    n._ensureSpecial(); 
    n._query.$explain = true; 
    n._limit = Math.abs(n._limit) * -1; 
    var e = n.next(); 

    function cleanup(obj) { 
     if (typeof obj != "object") { 
      return; 
     } 
     delete obj.allPlans; 
     delete obj.oldPlan; 
     if (typeof obj.length == "number") { 
      for (var i = 0; i < obj.length; i++) { 
       cleanup(obj[i]); 
      } 
     } 
     if (obj.shards) { 
      for (var key in obj.shards) { 
       cleanup(obj.shards[key]); 
      } 
     } 
     if (obj.clauses) { 
      cleanup(obj.clauses); 
     } 
    } 

    if (!verbose) { 
     cleanup(e); 
    } 
    return e; 
} 
> db.foo.find()._ensureSpecial 
function() { 
    if (this._special) { 
     return; 
    } 
    var n = {query:this._query}; 
    this._query = n; 
    this._special = true; 
} 
> 
+0

이 세상에,이 완전히했다. .count ()를 사용하는 경우를 제외하고는 똑같은 문제가 발생했으며 정확히 동일한 이유로 실패했습니다. 귀하와 Matt가 지정한 방식대로 쿼리의 패키지를 해제하십시오. 감사! –

1

아마도 runCommand()find()이 혼합되어 있습니다. 이 시도 :

db.people.find({ "$or" : [ { site : "mysite", site_id : "587125722" }, 
          { user_id : ObjectId("4fb811aae4b0b628b485a58d") } ] } 
      ).sort({ global_id : 1, user_id : 1 })