MongoDB $nearSphere gets slower if $maxDistance is used









up vote
0
down vote

favorite












I have a MongoDB containing a large amount of coordinates, which I use to query for the nearest position to a provided one, e.g. if the DB contains coordinates (2,2) and (3,3) and gets queried for the nearest position to (1,1) it would return (2,2).



Using the java driver, I can perform the query the following way:



MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, new BasicDBObject("$nearSphere", Arrays.asList(longitude, latitude)))).limit(1)


which works fine and returns the result quite fast (instantaneously). However, if the nearest position is very far way, this procedure still returns it and meanwhile I decided to retrieve such result only if it is within a radius R. Therefore I decided to employ $maxDistance:



BasicDBObject center = new BasicDBObject("$nearSphere", Arrays.asList(latitude, longitude));
center.put("$maxDistance", MAXDIST);
MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, center)).limit(1)


Which returns the expected result, however it takes about 5 seconds to do so.



I realize that I can circumvent this issue simply by using the former method and perform a simple logical test on the value returned, however I would like to understand why the latter procedure is so much slower than the former. Am I doing anything wrong?



Thank you for your attention










share|improve this question

























    up vote
    0
    down vote

    favorite












    I have a MongoDB containing a large amount of coordinates, which I use to query for the nearest position to a provided one, e.g. if the DB contains coordinates (2,2) and (3,3) and gets queried for the nearest position to (1,1) it would return (2,2).



    Using the java driver, I can perform the query the following way:



    MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, new BasicDBObject("$nearSphere", Arrays.asList(longitude, latitude)))).limit(1)


    which works fine and returns the result quite fast (instantaneously). However, if the nearest position is very far way, this procedure still returns it and meanwhile I decided to retrieve such result only if it is within a radius R. Therefore I decided to employ $maxDistance:



    BasicDBObject center = new BasicDBObject("$nearSphere", Arrays.asList(latitude, longitude));
    center.put("$maxDistance", MAXDIST);
    MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, center)).limit(1)


    Which returns the expected result, however it takes about 5 seconds to do so.



    I realize that I can circumvent this issue simply by using the former method and perform a simple logical test on the value returned, however I would like to understand why the latter procedure is so much slower than the former. Am I doing anything wrong?



    Thank you for your attention










    share|improve this question























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I have a MongoDB containing a large amount of coordinates, which I use to query for the nearest position to a provided one, e.g. if the DB contains coordinates (2,2) and (3,3) and gets queried for the nearest position to (1,1) it would return (2,2).



      Using the java driver, I can perform the query the following way:



      MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, new BasicDBObject("$nearSphere", Arrays.asList(longitude, latitude)))).limit(1)


      which works fine and returns the result quite fast (instantaneously). However, if the nearest position is very far way, this procedure still returns it and meanwhile I decided to retrieve such result only if it is within a radius R. Therefore I decided to employ $maxDistance:



      BasicDBObject center = new BasicDBObject("$nearSphere", Arrays.asList(latitude, longitude));
      center.put("$maxDistance", MAXDIST);
      MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, center)).limit(1)


      Which returns the expected result, however it takes about 5 seconds to do so.



      I realize that I can circumvent this issue simply by using the former method and perform a simple logical test on the value returned, however I would like to understand why the latter procedure is so much slower than the former. Am I doing anything wrong?



      Thank you for your attention










      share|improve this question













      I have a MongoDB containing a large amount of coordinates, which I use to query for the nearest position to a provided one, e.g. if the DB contains coordinates (2,2) and (3,3) and gets queried for the nearest position to (1,1) it would return (2,2).



      Using the java driver, I can perform the query the following way:



      MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, new BasicDBObject("$nearSphere", Arrays.asList(longitude, latitude)))).limit(1)


      which works fine and returns the result quite fast (instantaneously). However, if the nearest position is very far way, this procedure still returns it and meanwhile I decided to retrieve such result only if it is within a radius R. Therefore I decided to employ $maxDistance:



      BasicDBObject center = new BasicDBObject("$nearSphere", Arrays.asList(latitude, longitude));
      center.put("$maxDistance", MAXDIST);
      MongoConnection.getInstance().getCollection(DB, COLLECTION).find(new BasicDBObject(LOCATION, center)).limit(1)


      Which returns the expected result, however it takes about 5 seconds to do so.



      I realize that I can circumvent this issue simply by using the former method and perform a simple logical test on the value returned, however I would like to understand why the latter procedure is so much slower than the former. Am I doing anything wrong?



      Thank you for your attention







      mongodb mongodb-java






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 9 at 12:53









      João Matos

      7731624




      7731624



























          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













           

          draft saved


          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226075%2fmongodb-nearsphere-gets-slower-if-maxdistance-is-used%23new-answer', 'question_page');

          );

          Post as a guest



































          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















           

          draft saved


          draft discarded















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226075%2fmongodb-nearsphere-gets-slower-if-maxdistance-is-used%23new-answer', 'question_page');

          );

          Post as a guest














































































          Popular posts from this blog

          Use pre created SQLite database for Android project in kotlin

          Darth Vader #20

          Ondo