2012-08-30 5 views
2

나는 내가 실행하고있는 MongoDB 쿼리를 가지고 있으며, 필자가 알고있는 레코드를 가져 오지 않는다. 카테고리와 설명 (contains/like 정규 표현식을 통해) 두 가지를 필터링합니다. 카테고리를 기준으로 검색하면 해당 카테고리의 모든 레코드가 되돌아옵니다 (문제 레코드 포함).하지만 설명을 넣으면 그 레코드가 다시 표시되지 않습니다. 설명 텍스트와 일치하는 다른 레코드가 돌아 왔지만 어떤 이유로 든 내가 입력 한 내용에 관계없이이 레코드 하나를 설명 조건으로 되돌릴 수 없습니다. 매우 기괴합니다.MongoDB 쿼리를 어떻게 디버깅합니까?

MongoDB를 사용하여 디버깅하는 방법은 무엇입니까? 내 쿼리는 매우 간단합니다 :

var match = {}; 

var category = "hardware" 
if (category) 
    match.Category = category; 

var searchText = "ceramic" 
if (searchText) 
{ 
    match.Description = new RegExp("/.*" + searchText + ".*/"); 
} 

collection.find(match).toArray(function(err, items) 
{ 
    response.send(items); 
}); 

내가 돌아 오려고하는 항목은 하드웨어 범주에 있으며 검색 텍스트가 ""인 경우 다시 나타납니다. 설명에 "세라믹"이라는 단어가 있지만 searchText가 "세라믹"(또는 설명에있는 다른 단어가 여러 개있을 때) 인 경우 해당 항목은 다시 표시되지 않습니다. "세라믹"이라는 단어를 사용하는 다른 사람들도 설명하지만, 물론 그 항목의 구조는 다른 항목과 다르지 않습니다. 정말 경기를 통과해야합니다.

케이스가 정확합니다 (세라믹이 모두 설명과 필터에서 모두 낮아짐)./i는 검색에서 대/소문자를 구분하지 않도록 노력했습니다.

그럼 어떻게이 쿼리가 매우 명확하게 일치하는 항목을 생성하지 못하는지 알 수 있습니까?

+2

"세라믹"쿼리에서 돌아 오지 않을 다른 문서가 있어야합니다. 해당 문서를 게시물에 추가 할 수 있습니까? – JohnnyHK

답변

1

글쎄, 여기가 원인 일 수는 없지만 그 정규식은 조금 이상합니다. 다음과 같이 지정할 수 있습니다.

match.Description = new RegExp ("/"+ searchText + "/");

.*은 텍스트까지 모든 것을 매치시키고보다 복잡한 정규 표현식의 일부로 사용하지 않는 한 임의의 문자를 여러 번 매치한다는 것을 의미합니다. 그런 다음 필요가 없습니다.

디버깅 측면에서 MongoDB에서 쿼리가 어떻게 보이는지 알아 내고 쉘에서 제대로 작동하는지 확인하십시오. 여기에 빠른 샘플 문서입니다 :

{ 
    "_id" : ObjectId("503fab7bf6a278b7bda257d2"), 
    "category" : "hardware", 
    "Description" : "blah ceramic blah" 
} 

그리고이 일치 :

mongos> db.foo.find({"Description" : /ceramic/}).pretty() 
{ 
    "_id" : ObjectId("503fab7bf6a278b7bda257d2"), 
    "category" : "hardware", 
    "Description" : "blah ceramic blah" 
} 

또한 turn on profiling 및 프로그램이 (프로파일 링 오버 헤드를 가지고주의) MongoDB를에 보내는 것을 볼 볼 수 있습니다. 레벨 2가 페이지에서 언급 된 모든 쿼리를 볼 수 있기를 원할 것입니다.

관련 문제