2014-11-26 2 views
1

검색어 배열을 포함하는 문서 세트가 있습니다.모든 검색어가 포함 된 배열이있는 모든 Mongo 문서 찾기

[ "apples", "oranges", "bananas" ] 

사용자는 키워드 접두사 검색 문자열을 입력하고 배열의 각 용어를 포함하는 모든 문서를 검색하고 싶습니다. 예를 들어, "app oranges"는 위의 목록과 일치하지만 "applet oranges"는 그렇지 않습니다.

그러나 그것은 충분히 멀리 가지 않는다, 각 용어는 $ 정규식을 사용하여 접두어로 배열의 항목 중 하나 일치하는 것을 확인 달러 (A $)와 쿼리를 구성하는 매우 사소한 것 ...

각 키워드는 세트 내에서 고유 한 일치 항목을 가져야합니다. 예를 들어 '사과'가 이미 일치했기 때문에 '사과'와 '일치'할 수 없으므로 '사과 app'검색이 위 목록과 일치하지 않게됩니다. 이 제약은 더 미묘한 문제로 이어진다. 이 세트를 예로 들어 보겠습니다.

[ "france", "fred", "freddy" ] 

사용자가 "fr france"를 탭하면 일치해야합니다. "fr"과 일치하면 나머지 키워드에 대한 가능한 용어 목록에서 "france"가 제거되지 않습니다. 그렇지 않으면 뒤이어 나오는 "france"라는 용어에 대한 테스트가 실패합니다.

Mongo 쿼리로 구현해야합니다. 나는 Mongo에 아주 새롭기 때문에 어디서부터 시작해야할지, 심지어 이것도 가능하다는 단서가 없습니다. 할 수 있습니까? 그렇다면 어떻게?

+0

여러 일치가 발생할 수있는 경우 : 배열의 [텍스트 색인] (http://docs.mongodb.org/manual/core/index-text/)은 어떻습니까? 그들이 얻은 점수에 따라 결과를 정렬하고, 자동 형태소 분석을 수행 할 수 있습니다. 물론, 약간 흐릿해질 것입니다. 유스 케이스를 설명하지 않았기 때문에 필요에 맞는 텍스트 인덱싱을 판단하기가 어렵습니다. –

답변

1

시작하려면 텍스트 패턴과 일치하도록 $regex 연산자를 사용할 수 있습니다

var searchTerms = "app oranges".split(" "); 
var arr = []; 
searchTerms.forEach(function(i){ 
var reg = new RegExp("^"+i); 
arr.push({"names":{$regex:reg}}); 
}) 
db.collection.find({$and:arr}); 

당신에게 배열 names 포함 된 값이 app 시작하여 oranges를 포함와 문서를 제공겠습니까.

각각의 키워드는 "응용 프로그램" 용어는 "사과"이후 "사과"에 대해 일치 할 수 없기 때문에 검색 "사과 응용 프로그램은"위의 목록과 일치하지 않도록, 세트 내에서 고유 한 일치를해야한다 이미 과 일치했습니다. 이 제약은 더 미묘한 문제로 이어진다. 이 예로 을 설정 보자

이 논리는 전/쿼리를 발사 한 후 응용 프로그램 서버에서 수행되어야한다. 사용자가 substring이 다른 이전 문자열을 입력하면 쿼리는 이미 fromer와 일치하므로 실패하게됩니다.

+0

그게 문제의 핵심을 해결하지 못합니다. 나는 그것을 명확하게하기 위해 나의 질문을 업데이트했다. – tarmes

+0

업데이트 된 답변보기 – BatScream

+0

아니요. 사용자가 [appl 사과], "응용"과 같은 배열과 일치해야하지만 [apples ","orange "]와 일치하지 않아야합니다." – tarmes

관련 문제