2016-06-27 3 views
0

마지막 응용 프로그램에 마지막 쿼리가 하나 있는데,이 쿼리는 Parse에서 전송을 완료하는 데 가장 문제가 될 것으로 보입니다.(Parse -> Firebase) 어떻게이 쿼리를 변환 할 수 있습니까?

다음은 구문 분석 쿼리 :

let potential_query = UserAccounts.query()! 
let excluded_objects = [String]() 

for(...) excluded_objects.push(...); 

potential_query.whereKey('objectId', notContainedIn: excluded_objects); 
potential_query.whereKey('question_count', greaterThan: 2); 
potential_query.whereKey('deactivated', equalTo: false); 
potential_query.whereKey('discovery_enabled', equalTo: true); 
potential_query.whereKey('gender', equalTo: 'MALE'); 
potential_query.whereKey('age', greaterThan: 18); 
potential_query.whereKey('age', lessThan: 23); 
potential_query.whereKey('location', nearGeoPoint: ..., withinMiles: 15); // User within 15 miles based on location data. 
potential_query.limit = 1; 

제공 값이 고정되지 않고 인증 된 사용자에 따라 변경 있습니다. 파이어베이스에 대한 문서를 살펴보면 고급 쿼리를위한 옵션이없는 것처럼 보입니다. objectId은 Firebase에 uid입니다.

이것도 가능합니까?

+0

에 모두를 시도 할 수 있습니다. 몇 가지 옵션은 http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase를 참조하십시오. –

+0

@FrankvanPuffelen 고마워, 나는 이미 그 링크를 보았고 나는 해결책을 검토했다. 1. 내 응용 프로그램에 등록 된 모든 사용자의 개인 사용자 데이터를 클라이언트에 다운로드하기 때문에 실용적이지 않습니다. 2. 약간 더 실용적인 것처럼 보이지만 문제는 위치와 나이가 다양하며 데이터베이스에 정적으로 저장할 수 없다는 것입니다. QueryBase가이 문제를 해결할 수있는 방법이 있을지도 모르겠다. 3. 그것이 엉망이 될 것 같은데, 당신은 firebase에서 색인 생성에 대한 좋은 읽을 거리가 있습니까? 문서는 나를 위해 그것을 아주 잘 자르고 있지 않습니다. – Hobbyist

+1

인덱싱은 Firebase에 특정한 것이 아닙니다.[NoSQL 데이터 모델링] (https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/)에서이 기사를 적극 추천합니다. –

답변

0

[배경 : 저는 현재 Firebase 팀의 백엔드 엔지니어입니다. 나는 Parse 백엔드 엔지니어 였고 앱 성능에 많은 시간을 보냈다.]

Parse API는 양날의 검인 표현 언어가 풍부하다. 당신은 행복하게 거의 모든 쿼리를 작성할 수 있으며 Parse 백엔드는 어느 인덱스가 가장 도움이 될지 추측하기 위해 최선을 다할 것입니다. 저는 작년에 실제로 "Parse on Scale"이라는 관련 토크로 F8을 공동 발표했습니다. 쿼리 성능에 관한 몇 가지 비트를 볼 수 있습니다 starting at 16:30. TL : DR : 이러한 쿼리 연산자 중 일부만 데이터베이스 검색 범위를 좁히는 데 도움이됩니다. 귀하의 경우에서 가장 가치있는 두 가지는 아마도 지리적 쿼리와 연령 쿼리 일 것입니다. 표준 데이터베이스 색인은 색인이 둘 이상의 비항 등 (보다 큼 /보다 큼)이거나 다른 키의 비항 등 및 정렬 일 수 없습니다. 우리 수있을 때 가장 잘 작동하는 방법을 여러 평등 필드에 인덱스 + 하나 개 불평등하지만, 평등의 조건에 대한 토론 :

  • 당신은 (거의) 항상 쿼리에서 이러한 키를 사용하는 것입니다. 그렇지 않은 경우, 키가 조회의 일부인 경우와 그렇지 않은 경우에 대해 별도의 색인이 필요합니다.
  • 동등한 용어는 결과를 크게 좁 힙니다. 예 : 비 균등 인구 통계를 무시하면 연령 평등은 결과를 80x로 줄이고 성 평등은 결과를 2x 만 줄여야합니다. 당신이 원하는거야 때문에 당신은 'someGuess'을 필요

    myRef.orderByChild('age').startAt(18).endAt(23).limit(someGuess) 
    

    : 당신의 특별한 경우를 들어

, 나는 지리적 인덱스를 구축하고 나이 쿼리에 대한 표준 range operators를 사용하는 GeoFire을 사용 클라이언트 측의 나머지 쿼리 연산자를 실행하십시오. 쿼리에 오 탐지 (false positives)가 많이 발생하는 경우 제한을 사용할 수 있습니다 (반드시 그런 것은 아닙니다). 당신이 나이 또는 위치 정보 검색을 사용하는 것이 더 빨리인지 알 수없는 경우

, 당신은 참으로 도전이 될 것입니다 그 Promise.race

+0

정보를 주셔서 감사 드리며,'Promise.race'는 내가 들어 본 적이없는 아주 멋진 도구입니다. 그러나 엄청난 양의 쿼리 데이터가 있으면 (모바일 데이트) 우리가 수십만 개의 계정을 가지고 있다는 사실 (약 300,000)은 결정하기가 상당히 어려워 보입니다. 활성 사용자는 이미 다른 인근 사용자와 연결되며 나이를 기준으로 검색하는 것은 좋지만 최소 거리에서도 검색하고 싶습니다. 예를 들어, 18 ~ 23 명 사이에 20 ~ 20 만 명의 사용자가 15 마일 이내에 있지 않다면 다운로드하는 것이 무엇입니까 – Hobbyist

+0

주변의 모든 사용자를 다운로드 한 다음 클라이언트에서 필터링합니다 (응용 프로그램이 활성화되어있는 경우). 귀하의 지역에서 엄청난 양의 정보를 다운로드하게 될 것입니다. 위치별로 쿼리하고 다음을 말할 수 있습니까? '50 다운로드, 존재하지 않을 경우 스캔, 다음 50 다운로드'거의 일치하는 값이 발견되면 페이지 매김과 거의 비슷하게 소리가 사실입니까? – Hobbyist

+0

저는 https://github.com/davideast/Querybase를 가지고 놀았으며 쿼리 기능이 정말 훌륭합니다. 그러나 데이터 과부하처럼 보입니다. 또한'Promise.race'에 감사드립니다. 그 전에는 멋진 도구였습니다. – Hobbyist

관련 문제