2017-09-12 1 views
1

안녕 내 golang에 다음 코드를했다 :검색은 필요한 결과를 제공하지 않습니다

이 봐주세요 :

type User struct { 
    Id    int  `json:"id" bson:"_id"` 
    FirstName  string `json:"first_name" bson:"first_name"` 
    LastName  string `json:"last_name" bson:"last_name"` 
    EmailId   string `json:"email_id" bson:"email_id"` 
    Password  string `json:"password" bson:"password"` 
    PhoneNumber  string `json:"phone_number" bson:"phone_number"` 
    AltPhoneNumber string `json:"alt_phone_number" bson:"alt_phone_number"` 
    Gender   string `json:"gender" bson:"gender"` 
    Note   string `json:"note" bson:"note"` 
    Address   string `json:"address" bson:"address"` 
    AptNo   string `json:"apt_no" bson:"apt_no"` 
    City   string `json:"city" bson:"city"` 
    Zipcode   string `json:"zipcode" bson:"zipcode"` 
} 

query := bson.M{ "role" : "customer", 
        "status" : 1, 
        "$or": []bson.M{ 
         bson.M{"first_name":bson.RegEx{".*"+keyword+"*.", "i"} }, 
         bson.M{"last_name": bson.RegEx{".*"+keyword+"*.", "i"} }, 
         bson.M{"email_id": bson.RegEx{".*"+keyword, "i"} }, 
         bson.M{"phone_number": bson.RegEx{".*"+keyword, "i"} }, 
         bson.M{"alt_phone_number": bson.RegEx{".*"+keyword, "i"} }, 
       }} 

err = c.Find(query).All(&result) 

내가 먼저 이름을 가진 데이터베이스에 기록이 "swati"및 성 "sharma". "swati"을 검색하면 올바르게 작동합니다. 마찬가지로 "sharma"를 검색하면 이 제대로 작동합니다.

문제는 "swati sharma"를 검색 할 때 결과가 반환되지 않습니다. 아무도 내가이 출력을 얻을 수있는 방법을 말할 수 있습니까?

+0

'& bson.RegEx 같은 것을 시도 {패턴 : fmt.Sprintf (".. * %의 *", 키워드), 옵션 : "I"}' 도 사용하여 정규식을 테스트 HTTPS ://regex101.com/ 알림 정규 표현식은 포인터입니다. '&'. 연결은 읽기가 어렵고 엉망이되기 쉽기 때문에'fmt.Sprintf'를 사용합니다. (내 의견) 로직을 분해하고 테스트 할 수도 있습니다. 예를 들어 원래 논리를 사용하여 쿼리를 작성하는 경우가 있습니다. 'bson .M { "first_name": bson.RegEx { ". *"+ keyword + "*.", "i"}}'는 or, status 또는 role을 복잡하게 만들지 않습니다. 분리 및 정규식을 먼저 테스트하십시오. – reticentroot

+0

정규 표현식이 작동해야하는 것처럼 보입니다. 키워드가 예상 한 것과 같고 여분의 공백, 문자 등이 없다고 가정합니다. https://regex101.com/r/B9F3Wp/ 1 다른 일이 있습니다. – reticentroot

+0

@reticentroot 키워드에 여유 공간이 없는지 확인했습니다. 나는 정규식이 맞는 것, 유일한 차이점은 db에서 first_name과 last_name에 대한 문자열 전체 이름을 비교했다는 것입니다. – Swati

답변

1

나는 다음과 같이 코드를 변경했다.

 

    name := strings.Replace(keyword, " ", "|", -1) 
     conditions := bson.M{ "role" : config.ProviderRole, 
           "status" : status, 
           "$or": []bson.M{ 
            bson.M{"first_name":bson.RegEx{"(?i).*"+name+".*", "i"} }, 
            bson.M{"last_name": bson.RegEx{ "(?i).*"+name+".*", "i"} }, 
            bson.M{"email_id": bson.RegEx{".*"+keyword, "i"} }, 
            bson.M{"phone_number": bson.RegEx{".*"+keyword, "i"} }, 
            bson.M{"alt_phone_number": bson.RegEx{".*"+keyword, "i"} }, 
           }} 
    err = c.Find(query).All(&result) 

관련 문제