2016-11-24 1 views
0

나는 문서의 다음 2 열에서 검색을 수행하고있다 : 이름나 displayName합니다. 그러나 일부 레코드에는 displayName 열만 있습니다. 레코드가 둘 다있을 때 가능한 일치 항목에 대해 두 필드 (name 및 displayName)를 모두 검색하려고합니다. 레코드 나 displayName 열 이없는 경우 그렇지 않으면, 난 그냥 이름 대신를 검색 할 수 있습니다. 그래서 나는 또는을 할 것이라고 생각했습니다. 그러나 두 열이 모두있는 필드 만 검색합니다. 모든 레코드를 검색하려고하지만.두 개의 열을 검색하려면 어떻게합니까? (하나는 몇 개의 레코드에만 나타납니다)?

어떻게 위를 달성하기 위해 쿼리를 업데이트 할 수 있습니다? 여기에 내가 시도 내용은 다음과 같습니다

function search(search) { 
    return this.find({ $or: [ 
     {"displayName" : {"$regex" : ".*"+ search +".*", "$options": "-i"}}, 
     {"name" : {"$regex" : ".*"+ search +".*", "$options": "-i"}} 
    ]}).exec(); 
} 

그래서 위의 쿼리, 논리가 나 displayName 열이 존재하지 않는 경우, 첫 번째 검사가 이 거짓 그래서 다음 이름을 검색합니다 반환 저를 알려줍니다 일치에 따라 true/false를 반환합니다. 나는 두 번째 수표가 사실 일지라도 전체 결과가 틀림없이 나오기 때문에 (OR 대신 행동과 더 비슷 함) 분명히 여기에 뭔가가 빠져 있습니다.

데이터 예 :

{ id: 3, name: "John Steinbeck", displayName: "Steinbeck" } 
{ id: 4, name: "John Lennon" } 
{ id: 5, name: "Doe", displayName: "John" } 
{ id: 5, name: "Harry Potter", displayName: "Harry" } 

검색 단어 :

john 

예상 결과 :

{ id: 3, name: "John Steinbeck", displayName: "Steinbeck" } 
{ id: 4, name: "John Lennon" } 
{ id: 5, name: "Doe", displayName: "John" } 

나중에 편집 결국이 쿼리는 작동하지 않는 것처럼 보입니다. 문제는 쿼리가 아니라 데이터로 밝혀졌습니다. 인간의 실수. 나의 사과 :) 당신은 다른 조건했습니다

답변

0

: 두 필드가 존재하고

  • 만 이름이 존재 올바른 값이 올바른 값을
  • 사용 $exist$or

    • ! 예를 들어

      :

      db.col.find({ $or: [ { name: {$regex : ".*John.*"}}, displayName: {$regex : ".*Steinbeck.*"}}, { name: "john", { displayName: { $exists: false } } } ] }) 
      
    +0

    감사합니다. 나는 내 논리의 결함이 어디에 있었는지를 안다. 내 예에 대한 답을 적응,하지만 지금은 0 결과를 다시 얻을 : {$ 또는 [ { "이름": {$ 정규식을 : $ 옵션 "* 존 *.."} '-i', " 나 displayName ": {$ 정규식".. * 존 * ", $ 옵션 : '-i'}} {"이름 ": {$ 정규식". * 존 * ", $ 옵션 :. '-i' }, "나 displayName는": {$가 존재 : 거짓}} 가}] - 나는 단지 하나 개의 검색 매개 변수가 있음을 유의하시기 바랍니다 (위의 예에서 "존"입니다) – Toonsylvania

    +0

    @Toonsylvania 당신의'displayname'은 ** ** 스타인벡하지 **남자**!:) –

    +0

    당신이 나를 오해 한 것 같아요, 어쩌면 충분히 명확하지 않았습니다 :) 내가 찾고있는 건 ** 모든 레코드 **를 찾을 수 있다는 것입니다 ** 핵심어 ** ** 어느 하나 ** 2 개의 필드 (name 또는 displayName). 예제를 보면, 예상 결과 중 하나가 name이 아닌 displayName에 john이있는 {id : 5, name : "Doe", displayName : "John"}입니다. 그래서 존 (이 단어의 핵심어)은 그 열 중 하나에있을 수 있습니다 (또는 둘 다있을 수도 있음) – Toonsylvania

    0

    변화 쿼리 : 답장을

    db.getCollection('user').find({ $or: [ 
        {"name" : {$regex: "john", $options: "$i"}}, 
        {"displayName" : {$regex: "john", $options: "$i"}}]}) 
    
    관련 문제