2014-11-11 2 views
3

사용자를 이름으로 검색하려면 속성이 firstNamelastName입니다. 내가 재산을 가지고 있다면 fullName 이것은 사소한 것이지만 나는 그것을 가지고 있지 않다.2 개의 텍스트 필드를 1 개의 필드로 검색하십시오.

"Peter Robert"를 검색하려고하는데 검색하기 전에 2 개의 필드를 하나로 결합해야합니다.

어떻게해야합니까?

+0

귀하의 질문이 방금 편집되었으며 유성 태그가 제거되었습니다. 어느 쪽을 사용하고 있습니까? 유성이나 몽구스? 둘 다 가지지 않을거야. –

+0

나는 Meteor를 사용하고 있으며 일부 Meteor 개발자는 과거에 이런 질문을했을 수도 있습니다. –

+0

이전에 편집자가 태그를 삭제 한 것을 본 이후로 주로 물었습니다. 또한이 솔루션의 "일부"는 "서버"기반의 "minimongo"와 같은 것으로 즉시 변환되지 않기 때문에. 항상 코드 서버 측을 실행하여 메소드를 공개 할 수 있습니다. 이것을하는 많은 다른 방법. –

답변

5

기본적으로 원하는 소리는 "text search"입니다.

db.collection.ensureIndex({ "firstName": "text", "lastName": "text" }) 

db.collection.find({ "$text": { "$search": "Peter Robert" } }) 

이 처리하는 한 가지 방법입니다 : Text indexes 입력 용어가 모든 색인 필드에서 검색 될 수 있도록 여러 분야에 걸쳐 걸쳐 수 있습니다. 다른 경기도 반환하지만 정확한 경기는 최고 점수이므로 순위를 매길 수 있습니다.

또는, 당신은 당신이 항상 "분할"을 입력 토큰 화 할 수 있습니다 당신은 항상 다음 순서로 "피터 로버트"와 같은 문자열을 얻고 알고있는 경우 : 모든 아주 기본적인

var input = "Peter Robert"; 
var parts = input.split(/ /); // splits on space 

db.collection.find({ 
    "firstName": parts[0], 
    "lastName" parts[1] 
]) 

합니다. 심지어 믹스에 $regex$or 연산자를 적용

var input = "Peter Robert"; 
var regexStr = input.split(/ /).join("|"); // make it like "Peter|Robert" 

db.collection.find({ 
    "$or": [ 
     { "firstName": { "$regex": regexStr } }, 
     { "lastName": { "$regex": regexStr }} 
    ] 
}) 

솔직히, 당신도 $where 연산자와 자바 스크립트와 함께이 작업을 수행 할 수 있습니다. 아니 조건이 모든 문서에 대해 평가하는 것이기 때문에 비록 최고 :

db.collection.find(function(){ 
    return (this.firstName + " " + this.lastName) == "Peter Robert"; 
}) 

은 아마 비록 통합 프레임 워크 조금 더 나은 재생 :이 작업을 수행하는

db.collection.aggregate([ 
    // Borrow something from above to get "might" match documents 
    { "$match": { 
     "$or": [ 
      { "firstName": { "$regex": regexStr } }, 
      { "lastName": { "$regex": regexStr }} 
     ] 
    }}, 

    // Then project a "fullName" 
    { "$project": { 
     "firstName": 1, 
     "lastName": 1, 
     "fullName": { "$concat": [ "$firstName", " ", "$lastName" ] } 
    }}, 

    // Match on the fullName value 
    { "$match": { "fullName": input } } 

]) 

많은 방법을. "텍스트 검색"과 집계 및 "JavaScript 쿼리"와 같은 서버 측 연산을 처리 할 수있는 여러 가지 방법이 모두 있기 때문에 프레임 워크 (클라이언트에서 Mongo 함수를 "에뮬레이트"하는 것과 같은)에 제한되지 않습니다. 서버 로직 코드.

관련 문제