Parse Server - Как найти и заменить поле запроса на поле из другой таблицы в одном запросе - PullRequest
0 голосов
/ 19 марта 2020

Я не смог найти решение на Parse Server для следующей проблемы. Это эквивалентно использованию JOIN в SQL, но поскольку Parse Server использует No SQL, решение не является объединением.

Issue; На экране отчетов отображаются результаты запроса. Но одно из полей необходимо найти в другом классе и заменить на поле в этом другом классе.

Я могу решить эту проблему, только имея два отдельных вложенных запроса, но это далеко не эффективно. Можете ли вы показать мне, как сделать следующее в одном запросе или более эффективно:

 //get query result from database
        ParseQuery<ParseObject> query = ParseQuery.getQuery("access");
        query.whereStartsWith("tokenid", "prefix");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> objects, ParseException e) {
               for (int i=0; i<objects.size(); i++) {
                   String reportField1 = objects.get(i).getString("name");
                   String lookup = objects.get(i).getString("cityID");

                   //start the second query
                   ParseQuery<ParseObject> query2 = ParseQuery.getQuery("cities");
                   query2.whereEqualTo("cityID", lookup);
                   query2.getFirstInBackground(new GetCallback<ParseObject>() {
                       @Override
                       public void done(ParseObject object, ParseException e) {
                           String reportField2 = object.getString("cityname");
                       }
                   });
               }
            }
        });

1 Ответ

1 голос
/ 20 марта 2020

То, что вы ищете, называется pointer в Parse. Вместо хранения cityID на вашем access объекте, сохраните указатель на объект cities и включите его в свой запрос.

Вот пример из руководства Android

ParseQuery<ParseObject> query = ParseQuery.getQuery("Comment");

// Retrieve the most recent ones
query.orderByDescending("createdAt");

// Only retrieve the last ten
query.setLimit(10);

// Include the post data with each comment
query.include("post");

query.findInBackground(new FindCallback<ParseObject>() {
  public void done(List<ParseObject> commentList, ParseException e) {
    // commentList now contains the last ten comments, and the "post"
    // field has been populated. For example:
    for (ParseObject comment : commentList) {
      // This does not require a network access.
      ParseObject post = comment.getParseObject("post");
      Log.d("post", "retrieved a related post");
    }
  }
});

Сохраняя указатель на объект access, вы можете получить соответствующий cities возражать, просто включив его в свой запрос.

...