2017-10-20 1 views
0

누군가 Firebase에 특수 문자를 쿼리하는 방법을 설명 할 수 있습니까?Firebase 기호에 대한 빠른 쿼리

posts 
    post_1 
    description: "This is a post! #thisdoesntwork" 
    post_2 
    description: "Heres another post! #neitherdoesthis" 

를 내가 신속한에서 쿼리를 실행하면 - -

나는과 같이 일부 데이터를 가지고

let db = Database.database().reference() 

db.child("posts").queryOrdered(byChild: "description").queryStarting(atValue: "[a-zA-Z0-9]*").queryEnding(atValue: "#thisdoesntwork").observeSingleEvent(of: .value) { (snapshot) in 
    // No results! 
} 

아무것도 반환됩니다. 해시가 어떻게 든 탈출해야하는 특수 문자이기 때문에

db.child("posts").queryOrdered(byChild: "description").queryStarting(atValue: "[a-zA-Z0-9]*").queryEnding(atValue: "thisdoesntwork").observeSingleEvent(of: .value) { (snapshot) in 
    // One post gets returned here 
} 

이인가 - 내가 너무 같은 해시 태그를 생략 그러나 그것은 작동? 아니면 잘못된 방식으로 질문하고 있습니까?

미리 감사드립니다.

+0

[Firebase 데이터, 점 및 슬래시 추가하기] 가능한 복제본 (https://stackoverflow.com/questions/19132867/adding-firebase-data-dots-and-forward-slashes) – DoesData

+0

@DoesData 해당 답변은 맞습니다. 중복이 아니며 관계없는 정보가 있습니다. OP는 하위 문자열 유형 검색을 묻습니다. – Jay

답변

1

당신이 생각하는 것은 그렇지 않습니다. 설명하고 예제를 제공합시다.

문자열 검색을 수행하는 것으로 보입니다. 아마도 하위 문자열 검색 일 수도 있습니다.

Firebase는 부분 문자열 검색 기능을 제공하지 않으며 심지어 문자열 검색은 문자열 검색과 같지 않습니다. 즉, swift와 같은 언어로 사용됩니다.

그래서 우선이 그대로 [A-ZA-Z0-9] * 동일한 문자열 또는 문자로 시작하는 노드를 검색 할 것이라고

queryStarting(atValue: "[a-zA-Z0-9]*") 

유효하지 않습니다. 따라서 노드가 다음과 같이 표시되는 경우 :

posts 
    post_x 
    description: "[a-zA-Z0-9]* This node would be returned" 

일치 할 것입니다.

.startWith: a query that starts with the given string 
.endWith: a query ending with a string that starts with the given string 
     (not the ending part of a string or a substring) 

나를 당신의 구조

posts 
    post_1 
    description: "This is a post! #thisdoesntwork" 
    post_2 
    description: "Heres another post! #neitherdoesthis" 
    post_2 
    description: "a" 
    post_3 
    description: "n" 

그리고 게시물 1, 3을 반환합니다 예를 들어 쿼리

let postsRef = ref.child("posts") 
    let queryRef = postsRef.queryOrdered(byChild: "description") 
          .queryStarting(atValue: "This") 
          .queryEnding(atValue: "z") 
    queryRef.observeSingleEvent(of: .value) { snapshot in 
     print(snapshot) 
    } 

이 쿼리를 기반으로 예를 들어 구조를 제공하자, 4. 그 이유는 무엇입니까?

post_1 아스키 84

쿼리가 ASCII 값 84 (아스키 T)에서 시작하여 122 (아스키 z)로 끝나는 모든 노드를 반환 할 것이다 문자 대문자 T로 시작한다. 그래서 post 3은 ascii 97이고, post 4는 n, ascii 110입니다. 그래서 모든 것이 반환됩니다.

* 다음에 오는 경우 쿼리는 실제로 'This'로 시작하고 'z'로 끝나지만이 예제에서는 단순화됩니다.

한편으로는 약간 제한적으로 보일 수도 있지만 실제로는 꽤 강력합니다.

특정 문자열로 시작하는 일련의 값을 쿼리 할 때 사용합니다. 따라서 농산물 유통 회사를 소유하고 Apple, Banana, Peanut, Walnut과 같은 품목을 보유하고 있다고 가정합시다.당신이 당신의 과일의 모든 목록을 원한다면 당신이

items 
    item_0 
    description: fruit_apple 
    item_1 
    description: fruit_banana 
    item_2 
    description: nut_peanut 
    item_3 
    description: nut_walnut 

같은 데이터베이스를 구성 할 수 있습니다, 당신은 너무

let queryRef = postsRef.queryOrdered(byChild: "description") 
          .queryStarting(atValue: "fruit_") 
          .queryEnding(atValue: "fruit_") 

이라고 화합물 값처럼 조회 할 수 있습니다.

귀하의 경우에는 문자열 내에서 특수 문자 을 직접 검색 할 수 없지만 ASCII 코드 범위 내의 문자로 시작하는 문자 범위를 검색 할 수 있습니다.

"!"에서 시작하는 쿼리

33 ! 
34 \" 
35 # 
36 $ 
37 % 
38 & 
39 ' 
40 (
41 ) 
42 * 
43 + 
44 , 
45 - 
46 . 
47/

이 슈퍼 긴 대답은 정말 해결책이 아니다 그러나 당신이 조회 할 데이터를 얻을 수 있도록 어쩌면 당신의 중포 기지의 구조 조정에 도움이 될 것입니다 및에서 끝나는 "/"문자로 시작하는 모든 문자열을 반환 에.

+0

감사합니다. Jay. 이것은 틀림없이 나는 이것에 대해 생각하고 있다는 것을 깨닫게되었습니다. 레코드의 경우 해시 태그 인코딩을 끝내고 훨씬 쉽게 쿼리 할 수있는 다른 자식으로 분할했습니다. 전체 텍스트 검색을 위해서는 Algolia와 같은 것을 사용하는 것이 아마도 최선의 선택이었을 것이라고 생각합니다. 그러나 지금은 개발을 위해 무료 Firebase 계획 만 사용하고 있기 때문에 현재 지원되지 않습니다. –