nodejs mongodb and android studio slow fetch speed

Tags: , , ,



I have a system which, pulls data from my server and stores it to a mobile SQL database via android studio. It works but it is painful slow like 30mins. I have around 86000 records in my database and want to pull all of them out of the server. What is the best way to do this?

Presently I get the count from the server and then query the server database until i find each ID and then send that result back to my mobile app.

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);
    }
  });
});

I use a recersive function in my pull request for each ID

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");
            }
        });
    }

How Can I speed this up or do it differently to speed it up?

Answer

  1. Try to fetch as much data as possible at once ( limit the amount of queries you do ). It is hard to tell you how since I don’t know your monogDB collection.
  2. Try to do this with as little requests as possible. If you can return all the fetched data at once, this will save you some time.
  3. JSON may be very slow when doing it on 86000 documents
  4. Consider caching the data for future users

Right now i suspect what is limiting you is the fact that you are doing 86000 queries to the db… If you can get the entire mongoDB collection it may be a bit faster( look at notes )

Notes: https://docs.mongodb.com/manual/reference/method/db.collection.find/#db-collection-find ( omit the query parameter will result in fetching the entire collection )



Source: stackoverflow