Join Queries
8 мин
запрос объединения с использованием parse введение в этом руководстве вы будете выполнять реляционные запросы в parse, имитируя поведение sql запросов join с использованием nosql базы данных предварительные условия чтобы завершить этот учебник, вам потребуется приложение созданное на back4app https //www back4app com/docs/get started/new parse app цель запрос реляционных данных, хранящихся на back4app, в стиле sql запросов join 1 понимание класса parse query любая операция запроса parse использует тип объекта \<font color="#2166ae">parse query\</font> , который поможет вам извлекать конкретные данные из вашей базы данных на протяжении всего вашего приложения крайне важно знать, что \<font color="#2166ae">parse query\</font> разрешится только после вызова метода извлечения (например, \<font color="#2166ae">parse query find\</font> или \<font color="#2166ae">parse query get\</font> ), поэтому запрос может быть настроен, и несколько модификаторов могут быть связаны перед фактическим вызовом чтобы создать новый \<font color="#2166ae">parse query\</font> , вам нужно передать в качестве параметра желаемый \<font color="#2166ae">parse object\</font> подкласс, который будет содержать результаты вашего запроса пример запроса можно увидеть ниже, в котором запрашивается вымышленный \<font color="#2166ae">profile\</font> подкласс 1 // this will create your query 2 let parsequery = new parse query("profile"); 3 // the query will resolve only after calling this method 4 let queryresult = await parsequery find(); вы можете узнать больше о классе \<font color="#2166ae">parse query\</font> здесь в официальной документации https //parseplatform org/parse sdk js/api/master/parse query html 2 сохраните некоторые данные на back4app давайте создадим два примера классов, \<font color="#2166ae">tablea\</font> и \<font color="#2166ae">tableb\</font> , которые будут целями наших запросов в этом руководстве в консоли parse js можно выполнять javascript код напрямую, запрашивая и обновляя содержимое вашей базы данных приложения с помощью команд js sdk запустите код ниже из вашей js консоли и вставьте данные на back4app вот как выглядит консоль js на вашей панели управления продолжайте и создайте классы с следующим содержимым 1 // create tablea and its records 2 let tablearecord1 = new parse object('tablea'); 3 tablearecord1 set('fielda', 'value a 1'); 4 tablearecord1 = await tablearecord1 save(); 5	 6 let tablearecord2 = new parse object('tablea'); 7 tablearecord2 set('fielda', 'value a 2'); 8 tablearecord2 = await tablearecord2 save(); 9	 10 let tablearecord3 = new parse object('tablea'); 11 tablearecord3 set('fielda', 'value a 3'); 12 tablearecord3 = await tablearecord3 save(); 13	 14 // create tableb and its records, some of them linked to tablea 15 let tablebrecord1 = new parse object('tableb'); 16 tablebrecord1 set('fieldb', 'value b 1'); 17 tablebrecord1 set('link', tablearecord1); 18 tablebrecord1 = await tablebrecord1 save(); 19	 20 let tablebrecord2 = new parse object('tableb'); 21 tablebrecord2 set('fieldb', 'value b 2'); 22 tablebrecord2 set('link', tablearecord1); 23 tablebrecord2 = await tablebrecord2 save(); 24	 25 let tablebrecord3 = new parse object('tableb'); 26 tablebrecord3 set('fieldb', 'value b 3'); 27 tablebrecord3 set('link', tablearecord3); 28 tablebrecord3 = await tablebrecord3 save(); 29	 30 let tablebrecord4 = new parse object('tableb'); 31 tablebrecord4 set('fieldb', 'value b 4'); 32 tablebrecord4 = await tablebrecord4 save(); 33	 34 console log('success!'); 3 запрос данных теперь, когда вы заполнили классы, мы можем выполнять реляционные запросы в них давайте начнем с выполнения \<font color="#2166ae">inner join\</font> , вводя реляционный запрос соединения, который мы будем использовать во всех наших примерах этот запрос представляет результаты двух объединенных запросов между таблицами a и b, возвращая все записи, которые связаны по определенному условию с использованием метода \<font color="#2166ae">parse query matchesquery\</font> 1 // join query, get all records in tablea that have matching records in tableb 2 let innerquerytablea = new parse query("tablea"); 3 // limit to 10 results only for example so we don't fetch too much data 4 innerquerytablea limit(10); 5 let joinquerytableb = new parse query("tableb"); 6 // match the tablea query by the "link" property 7 joinquerytableb matchesquery("link", innerquerytablea); 8 // include the "link" property so we have the content of tablea as well 9 joinquerytableb include("link"); 10 let joinqueryresults = await joinquerytableb find(); 11	 12 // inner join, get only the records in tablea that have matching records in tableb 13 console log("inner join"); 14 console log("table a id | field a | field b"); 15 for (let joinresult of joinqueryresults) { 16 console log( 17 `${joinresult get("link") id} | ${joinresult 18 get("link") 19 get("fielda")} | ${joinresult get("fieldb")}` 20 ); 21 } поведение запроса \<font color="#2166ae">inner join\</font> sql точно такое же, как и в нашем универсальном реляционном запросе соединения, поэтому нам нужно вывести его результаты в консоль помните, что с помощью \<font color="#2166ae">parse object\</font> вы можете использовать метод get для получения данных по имени столбца теперь давайте выполним \<font color="#2166ae">left outer join\</font> с получением всех записей из \<font color="#2166ae">tablea\</font> и отображением реляционных данных из tableb, когда это возможно 1 // join query, get all records in tablea that have matching records in tableb 2 let innerquerytablea = new parse query("tablea"); 3 // limit to 10 results only for example so we don't fetch too much data 4 innerquerytablea limit(10); 5 let joinquerytableb = new parse query("tableb"); 6 // match the tablea query by the "link" property 7 joinquerytableb matchesquery("link", innerquerytablea); 8 // include the "link" property so we have the content of tablea as well 9 joinquerytableb include("link"); 10 let joinqueryresults = await joinquerytableb find(); 11	 12 // left outer join, get records in tablea that have matching records in tableb and also every 13 // other tablea record 14 let querytablea = new parse query("tablea"); 15 querytablea limit(10); 16 let querytablearesults = await querytablea find(); 17 console log("left join"); 18 console log("table a id | field a | field b"); 19 for (let result of querytablearesults) { 20 // get all entries from join query that have a link to this tablea entry 21 let joinqueryresultsfiltered = joinqueryresults filter( 22 (joinqueryresult) => 23 joinqueryresult get("link") !== undefined && 24 joinqueryresult get("link") id == result id 25 ); 26 if (joinqueryresultsfiltered length > 0) { 27 for (let joinresult of joinqueryresultsfiltered) { 28 let fieldbvalue = joinresult get("fieldb"); 29 console log(`${result id} | ${result get("fielda")} | ${fieldbvalue}`); 30 } 31 } else { 32 console log(`${result id} | ${result get("fielda")} | `); 33 } 34 } правое \<font color="#2166ae">внешнее соединение\</font> является противоположностью левого, извлекая записи из \<font color="#2166ae">tableb\</font> 1 // join query, get all records in tablea that have matching records in tableb 2 let innerquerytablea = new parse query("tablea"); 3 // limit to 10 results only for example so we don't fetch too much data 4 innerquerytablea limit(10); 5 let joinquerytableb = new parse query("tableb"); 6 // match the tablea query by the "link" property 7 joinquerytableb matchesquery("link", innerquerytablea); 8 // include the "link" property so we have the content of tablea as well 9 joinquerytableb include("link"); 10 let joinqueryresults = await joinquerytableb find(); 11	 12 // right outer join, get records in tablea that have matching records in tableb and also every 13 // other tableb record 14 let querytableb = new parse query("tableb"); 15 querytableb limit(10); 16 let querytablebresults = await querytableb find(); 17 console log("right join"); 18 console log("table b id | field a | field b"); 19 for (let result of querytablebresults) { 20 // get all entries from join query that matches this tableb entry 21 let joinqueryresultsfiltered = joinqueryresults filter( 22 (joinqueryresult) => joinqueryresult id == result id 23 ); 24 if (joinqueryresultsfiltered length > 0) { 25 for (let joinresult of joinqueryresultsfiltered) { 26 let fieldavalue = ""; 27 if (joinresult get("link") !== undefined) { 28 fieldavalue = joinresult get("link") get("fielda"); 29 } 30 console log( 31 `${result id} | ${fieldavalue} | ${joinresult get("fieldb")}` 32 ); 33 } 34 } else { 35 console log(`${result id} | | ${result get("fieldb")}`); 36 } 37 } наконец, у нас есть \<font color="#2166ae">полный внешний join\</font> который является комбинацией левого и правого внутренних соединений 1 // join query, get all records in tablea that have matching records in tableb 2 let innerquerytablea = new parse query("tablea"); 3 // limit to 10 results only for example so we don't fetch too much data 4 innerquerytablea limit(10); 5 let joinquerytableb = new parse query("tableb"); 6 // match the tablea query by the "link" property 7 joinquerytableb matchesquery("link", innerquerytablea); 8 // include the "link" property so we have the content of tablea as well 9 joinquerytableb include("link"); 10 let joinqueryresults = await joinquerytableb find(); 11	 12 // full outer join, combining left and right outer join results 13 console log("full join"); 14 console log("table id | field a | field b"); 15 // first print all inner join results 16 for (let joinresult of joinqueryresults) { 17 console log( 18 `${joinresult get("link") id} | ${joinresult 19 get("link") 20 get("fielda")} | ${joinresult get("fieldb")}` 21 ); 22 } 23 // print left join leftovers 24 let outerquerytablea = new parse query("tablea"); 25 outerquerytablea limit(10); 26 let outerquerytablearesults = await outerquerytablea find(); 27 // get all entries from query that doesn't match the join query results 28 let filteredouterquerytablearesults = outerquerytablearesults filter( 29 (outerquerytablearesult) => 30 joinqueryresults find( 31 (joinqueryresult) => 32 joinqueryresult get("link") !== undefined && 33 joinqueryresult get("link") id === outerquerytablearesult id 34 ) === undefined 35 ); 36 for (let result of filteredouterquerytablearesults) { 37 console log(`${result id} | ${result get("fielda")} | `); 38 } 39 // print right join leftovers 40 let outerquerytableb = new parse query("tableb"); 41 outerquerytableb limit(10); 42 let outerquerytablebresults = await outerquerytableb find(); 43 // get all entries from query that doesn't match the join query results 44 let filteredouterquerytablebresults = outerquerytablebresults filter( 45 (outerquerytablebresult) => 46 joinqueryresults find( 47 (joinqueryresult) => joinqueryresult id === outerquerytablebresult id 48 ) === undefined 49 ); 50 for (let result of filteredouterquerytablebresults) { 51 console log(`${result id} | | ${result get("fieldb")}`); 52 } заключение в конце этого руководства вы узнали, как выполнять реляционные запросы на back4app, используя parse и эмулируя наиболее распространенные sql \<font color="#2166ae">join\</font> запросы в nosql базе данных