nodejs mongodb и android студийная медленная скорость выборки - PullRequest
0 голосов
/ 05 августа 2020

У меня есть система, которая извлекает данные с моего сервера и сохраняет их в мобильной базе данных SQL через android studio. Это работает, но болезненно медленно, как 30 минут. В моей базе данных около 86000 записей, и я хочу вытащить их все с сервера. Как лучше всего это сделать?

В настоящее время я получаю счет с сервера, а затем запрашиваю базу данных сервера, пока не найду каждый идентификатор, а затем отправлю результат обратно в свое мобильное приложение.

app.post("/get_data", function(req, res)
{
    var Id_request = req.body.Id_request;//The requested ID

    var query = {Val_String : Id_request};//Query value
    //console.log(query);
    //Data.find({}, function(err, result) {//Finds all data
    Data.findOne(query, function(err, result) {//Finds all data
    if (err) {
      //res.status(400).send(err);
      console.log("Sending error");
      res.status(200).send();
    } else {
      return res.json(result);
    }
  });
});

Я использую функцию приема в моем запросе на перенос для каждого идентификатора

private void call_method()
    {
        HashMap<String, String> map = new HashMap<>();
        map.put("Id_request", Integer.toString(data_pointer));//The ID value
        Call<Fetch_result> call = retrofitInterface.executeGet_data(map);//Run the post
        call.enqueue(new Callback<Fetch_result>() {
            //call.enqueue(new Callback<Fetch_result>() {
            @Override
            public void onResponse(Call<Fetch_result> call, Response<Fetch_result> response) {
                if (response.code() == 200)//Successful login
                {
                    D1= response.body().getT1_String();
                    D2= response.body().getT2_String();
                  
                    data_pointer = data_pointer + 1;
                    boolean result = BLE_DB.addData_Downloaded(D1,D2);//Add data
    
                    if(data_pointer<= Total_entries) {//Call method again
                        call_method();//Recursive here
                    }else if (data_pointer > Total_entries){
                        Utils.toast(getApplicationContext(),"All data received");
                    }

                } else if (response.code() == 404) {
                    Utils.toast(getApplicationContext(), "Get data fail");
                }
            }

            @Override
            public void onFailure(Call<Fetch_result> call, Throwable t) {
                Utils.toast(getApplicationContext(), "Get data error");
            }
        });
    }

Как я могу ускорить это или сделать это по-другому, чтобы ускорить его?

1 Ответ

1 голос
/ 05 августа 2020
  1. Постарайтесь получить как можно больше данных за один раз (ограничьте количество выполняемых запросов). Трудно сказать вам, как это сделать, поскольку я не знаю вашу коллекцию monogDB.
  2. Постарайтесь сделать это с как можно меньшим количеством запросов. Если вы можете вернуть все извлеченные данные сразу, это сэкономит вам время.
  3. JSON может быть очень медленным при выполнении этого для 86000 документов
  4. Рассмотрите возможность кэширования данных для будущих пользователей

Прямо сейчас я подозреваю, что вас ограничивает тот факт, что вы выполняете 86000 запросов к базе данных ... Если вы можете получить всю коллекцию mongoDB, это может быть немного быстрее (см. Примечания )

Примечания: https://docs.mongodb.com/manual/reference/method/db.collection.find/#db -collection-find (отсутствие параметра запроса приведет к получению всей коллекции)

...