Query Cookbook
리액트 네이티브에서 Parse 쿼리 요리책
소개
우리는 이미 Parse.Query를 사용하여 get를 통해 단일 Parse.Object를 Back4App에서 검색하는 방법을 보았습니다. Parse.Query를 사용하여 데이터를 검색하는 다른 방법이 많이 있습니다 - 여러 개체를 한 번에 검색하거나, 검색하려는 개체에 조건을 사용할 수 있습니다.
이 가이드에서는 Parse.Query 클래스에 대해 깊이 파고들고 쿼리를 작성하는 데 사용할 수 있는 모든 메서드를 살펴볼 것입니다. 간단한 데이터베이스 클래스를 사용하여 Back4App의 자바스크립트 콘솔을 통해 쿼리를 수행할 것입니다.
전제 조건
이 튜토리얼을 완료하려면 다음이 필요합니다:
목표
다양한 메서드를 가진 Parse.Query 클래스를 탐색합니다.
Parse.Query 클래스
Parse에서의 모든 쿼리 작업은 Parse.Query 객체 유형을 사용하며, 이는 앱 전반에 걸쳐 Back4App에서 특정 데이터를 검색하는 데 도움이 됩니다. 새로운 Parse.Query, 생성하려면 원하는 Parse.Object 하위 클래스를 매개변수로 전달해야 하며, 이는 쿼리 결과를 포함할 것입니다.
중요한 점은 Parse.Query는 retrieve 메서드(예: Parse.Query.find 또는 Parse.Query.get 호출 후에만 해결된다는 것입니다. 따라서 쿼리를 설정하고 실제로 호출되기 전에 여러 수정자를 연결할 수 있습니다.
더 많은 정보는 Parse.Query 클래스에 대해 공식 문서에서 여기.
Back4App에서 JS 콘솔 사용하기
Back4App 애플리케이션 대시보드 내에서 JavaScript 코드를 직접 실행할 수 있는 매우 유용한 API 콘솔을 찾을 수 있습니다. 이 가이드를 사용하여 Back4App에서 데이터 객체를 저장하고 쿼리할 것입니다. 앱의 주요 대시보드에서 Core->API Console->JS Console.

데이터 객체 저장하기
이 가이드를 기반으로 쿼리를 실행하려면 먼저 앱에 데이터를 채워야 합니다. 유명인 이름과 다음 필드를 사용하여 소셜 미디어 프로필 클래스를 모방하는 Profile이라는 샘플 클래스를 만들어 보겠습니다:
- 문자열 타입이름:
- 날짜 타입생일:
- 숫자 (정수) 타입친구 수:
- 배열 (문자열 배열) 타입좋아하는 음식:
- 배열 (숫자 배열) 타입행운의 숫자:
- GeoPoint 타입로그인 위치:
- Nullable 포인터 타입프리미엄 멤버십, 관련된 멤버십 클래스는 문자열 이름과 날짜 만료 날짜 필드를 포함합니다.
여기 Parse.Object 클래스 생성 코드가 있으니, API 콘솔에서 실행해 보세요:
1 // Add Profile objects and create table
2 // Adam Sandler
3 let Profile = new Parse.Object('Profile');
4 Profile.set('name', 'Adam Sandler');
5 Profile.set('birthDay', new Date('09/09/1966'));
6 Profile.set('friendCount', 2);
7 Profile.set('favoriteFoods', ['Lobster', 'Bread']);
8 Profile.set('luckyNumbers', [2, 7]);
9 Profile.set('lastLoginLocation', new Parse.GeoPoint(37.38412167489413, -122.01268034622319));
10 await Profile.save();
11
12 // Britney Spears
13 Profile = new Parse.Object('Profile');
14 Profile.set('name', 'Britney Spears');
15 Profile.set('birthDay', new Date('12/02/1981'));
16 Profile.set('friendCount', 52);
17 Profile.set('favoriteFoods', ['Cake', 'Bread']);
18 Profile.set('luckyNumbers', [22, 7]);
19 Profile.set('lastLoginLocation', new Parse.GeoPoint(37.38412167489413, -122.01268034622319));
20 await Profile.save();
21
22 // Carson Kressley
23 Profile = new Parse.Object('Profile');
24 Profile.set('name', 'Carson Kressley');
25 Profile.set('birthDay', new Date('11/11/1969'));
26 Profile.set('friendCount', 12);
27 Profile.set('favoriteFoods', ['Fish', 'Cookies']);
28 Profile.set('luckyNumbers', [8, 2]);
29 Profile.set('lastLoginLocation', new Parse.GeoPoint(37.38412167489413, -122.01268034622319));
30 await Profile.save();
31
32 // Dan Aykroyd
33 // Creates related object Membership for this user only
34 let Membership = new Parse.Object('Membership');
35 Membership.set('name', 'Premium');
36 Membership.set('expirationDate', new Date('10/10/2030'))
37 await Membership.save();
38 Profile = new Parse.Object('Profile');
39 Profile.set('name', 'Dan Aykroyd');
40 Profile.set('birthDay', new Date('07/01/1952'));
41 Profile.set('friendCount', 66);
42 Profile.set('favoriteFoods', ['Jam', 'Peanut Butter']);
43 Profile.set('luckyNumbers', [22, 77]);
44 Profile.set('lastLoginLocation', new Parse.GeoPoint(37.38412167489413, -122.01268034622319));
45 Profile.set('premiumMembership', Membership);
46 await Profile.save();
47
48 // Eddie Murphy
49 Profile = new Parse.Object('Profile');
50 Profile.set('name', 'Eddie Murphy');
51 Profile.set('birthDay', new Date('04/03/1961'));
52 Profile.set('friendCount', 49);
53 Profile.set('favoriteFoods', ['Lettuce', 'Pepper']);
54 Profile.set('luckyNumbers', [6, 5]);
55 Profile.set('lastLoginLocation', new Parse.GeoPoint(-27.104919974838154, -52.61428045237739));
56 await Profile.save();
57
58 // Fergie
59 Profile = new Parse.Object('Profile');
60 Profile.set('name', 'Fergie');
61 Profile.set('birthDay', new Date('03/27/1975'));
62 Profile.set('friendCount', 55);
63 Profile.set('favoriteFoods', ['Lobster', 'Shrimp']);
64 Profile.set('luckyNumbers', [13, 7]);
65 Profile.set('lastLoginLocation', new Parse.GeoPoint(-27.104919974838154, -52.61428045237739));
66 await Profile.save();
67
68 console.log('Success!');이 코드를 실행한 후, 데이터베이스에 프로필 클래스가 생성된 여섯 개의 객체와 함께 있어야 합니다. 새로운 클래스는 다음과 같아야 합니다:

이제 모든 Parse.Query 메서드의 예를 살펴보면서 그들이 하는 일에 대한 간단한 설명을 추가하겠습니다. 이 목록의 일부 메서드는 옵션을 추가 인수로 받을 수 있지만, 대부분의 경우 이는 masterKey 사용과 관련이 있으며 이 가이드 내용과는 관련이 없으므로, 관련이 없는 경우 이 가능성은 생략됩니다.
쿼리 검색기
이 방법들은 쿼리를 실행하고 결과를 검색하는 책임이 있으며, 항상 쿼리 구현에 존재합니다.
//Cancels the current network request.
1 let query = new Parse.Query('Profile');
2 let queryResult = await query.find();
3 // This is hard to test in small databases, since by the time
4 // "cancel" is called, the "find" request is already resolved
5 queryResult = query.cancel();
6 console.log(queryResult);쿼리 조건자
이 방법들은 쿼리에 조건부 제약을 적용할 수 있는 가능성을 제공합니다. 이는 쿼리에서 가장 중요한 작업이라고 할 수 있습니다. 이러한 작업은 결과가 검색되기 전에 모두 연결할 수 있으므로, 쿼리 요구 사항을 해결하기 위해 많은 조합을 달성할 수 있습니다.
// Helper that is called by Parse for filtering objects using conditional constants, such as “$gt”, “$eq” and so on. Only usable by users in very specific cases.
1 let query = new Parse.Query('Profile');
2 query._addCondition('friendCount', '$gt', 25);
3 let queryResult = await query.find();
4 console.log(queryResult);//Filters objects in which a string key value contains the provided text value. Be aware that this condition is case-sensitive.
1 let query = new Parse.Query('Profile');
2 // This can be slow in large databases and are case sensitive
3 query.contains('name', 'da');
4 let queryResult = await query.find();
5 console.log(queryResult);// Requires that a key’s value does not match a value in an object returned by a different Parse.Query. Useful for multi-object querying.
1 let query = new Parse.Query('Profile');
2 // Multiple queries can be combined using this, useful when there are more objects
3 // related, not our example case
4 query.doesNotMatchKeyInQuery('friendCount', 'friendCount', new Parse.Query('Profile').lessThan('friendCount', 50));
5 query.greaterThan('friendCount', 10);
6 let queryResult = await query.find();
7 console.log(queryResult);//Filters objects in which a key value is set.
1 let query = new Parse.Query('Profile');
2 query.exists('premiumMembership');
3 let queryResult = await query.find();
4 console.log(queryResult);// Filters objects in which a specific key’s value is lesser than the provided value.
1 let query = new Parse.Query('Profile');
2 // lessThan can be used on numbers and dates
3 query.lessThan('birthDay', new Date('08/19/1980'));
4 let queryResult = await query.find();
5 console.log(queryResult);//Requires that an object contained in the given key matches another query. Useful for multi-object querying.
1 let innerQuery = new Parse.Query('Membership');
2 innerQuery.greaterThan('expirationDate', new Date());
3 let query = new Parse.Query('Profile');
4 query.exists('premiumMembership');
5 query.matchesQuery('premiumMembership', innerQuery);
6 let queryResult = await query.find();
7 console.log(queryResult);쿼리 정렬
대부분의 쿼리에서 필수적이며, Parse에서 정렬을 쉽게 달성할 수 있으며 두 개 이상의 정렬 제약 조건 간에 연결할 수도 있습니다.
//Sorts by text score when using Parse.Query.fullText
1 let query = new Parse.Query('Profile');
2 query.fullText('name', 'Dan', { diacriticSensitive: false, caseSensitive: false });
3 query.sortByTextScore();
4 let queryResult = await query.find();
5 console.log(queryResult);필드 선택
이 메서드는 쿼리 결과에 포함될 수 있는 필드 값을 결정합니다.
// Return all fields in the returned objects except the ones specified.
1 let query = new Parse.Query('Profile');
2 query.exclude('name');
3 let queryResult = await query.find();
4 console.log(queryResult[0].get('name') === undefined);
5 console.log(queryResult[0].get('birthDay'));지오포인트 쿼리
이들은 지오포인트 쿼리에 특정한 방법입니다.
// Order objects by how near the key value is from the given GeoPoint.
1 let query = new Parse.Query('Profile');
2 query.near('lastLoginLocation', new Parse.GeoPoint(37.38412167489413, -122.01268034622319));
3 let queryResult = await query.find();
4 console.log(queryResult);//Find objects whose key value is near the given GeoPoint and within the maxDistance value. The sorted boolean value determines if the results should be sorted by distance ascending.
1 let query = new Parse.Query('Profile');
2 query.withinMiles('lastLoginLocation', new Parse.GeoPoint(37.38412167489413, -122.01268034622319), 60, true);
3 let queryResult = await query.find();
4 console.log(queryResult);페이지 매김
이 방법들은 많은 결과를 검색할 쿼리에 유용한 페이지 매김 유틸리티와 관련이 있습니다.
//Sets a flag that will wrap or not the query response in an object containing results, holding the array of Parse.Object and count integer holding the total number of results.
1 let query = new Parse.Query('Profile');
2 query.withCount(true);
3 let queryResult = await query.find();
4 console.log(queryResult);응답 처리
이 방법들은 쿼리 응답을 처리하기 위한 도우미로, 쿼리가 해결된 후 호출될 콜백을 큐에 추가할 수 있게 해줍니다. 이들은 쿼리 해결자 역할도 하며, find 및 first과 같습니다.
// Iterates over each result from the query and calls a callback for each one, in an unspecified order. Note that execution will halt on a rejected promise, so make sure to handle this case if using promises.
1 let query = new Parse.Query('Profile');
2 let queryResult = await query.each((result) => console.log(result));
3 console.log(queryResult);복합 쿼리
이 방법들은 복합 쿼리를 생성하며, 이는 하나 이상의 Parse.Query 인스턴스를 결합하여 더 복잡한 결과를 얻을 수 있습니다.
//Compose a compound query that is the OR of the passed queries.
1 let query1 = new Parse.Query('Profile');
2 query1.greaterThan('friendCount', 10);
3 let query2 = new Parse.Query('Profile');
4 query1.lessThan('friendCount', 50);
5 let query = Parse.Query.or(query1, query2);
6 let queryResult = await query.find();
7 console.log(queryResult);데이터베이스 관련
이 방법들은 데이터베이스 선호도 및 작업과 관련이 있습니다.
//SWhen using a MongoDB replica set, use this method to choose from which replica the objects will be retrieved. The possible values are PRIMARY (default), PRIMARY_PREFERRED, SECONDARY, SECONDARY_PREFERRED, or NEAREST.
1 let query = new Parse.Query('Profile');
2 query.readPreference(''PRIMARY'');
3 let queryResult = await query.find();
4 console.log(queryResult);로컬 데이터 저장소
이 방법은 쿼리의 소스를 선택하고 로컬 데이터 저장소를 사용할 수 있게 해줍니다.
//Changes the source of this query to a specific group of pinned objects.
1 let query = new Parse.Query('Profile');
2 query.fromPinWithName('pinnedObjects');
3 let queryResult = await query.find();
4 console.log(queryResult);JSON 세부사항
쿼리를 JSON으로 표현하고 검색할 수 있게 해주는 메서드입니다.
//Add a previously generated JSON representation of query operations to this query.
1 let query = new Parse.Query('Profile');
2 query.greaterThan('friendCount', 10);
3 let queryJSON = await query.toJSON();
4 let query2 = new Parse.Query('Profile');
5 query2.withJSON(queryJSON);
6 let queryResult = await query2.find();
7 console.log(queryResult);
//Static method to restore Parse.Query by JSON representation, internally calling Parse.Query.withJSON.
1 let query = new Parse.Query('Profile');
2 query.greaterThan('friendCount', 10);
3 let queryJSON = await query.toJSON();
4 let query2 = Parse.Query.withJSON('Profile', queryJSON);
5 let queryResult = await query2.find();
6 console.log(queryResult);결론
이 가이드의 끝에서, 당신은 Parse에서 모든 데이터 쿼리 메서드를 수행하는 방법을 배웠습니다. 다음 가이드에서는 React Native에서 복잡한 Parse 쿼리에 대해 배울 것입니다.