sql >> Database >  >> NoSQL >> MongoDB

hoe mongoDB als zoekmachine te gebruiken?

MongoDB 3.4rc met 2mln records

Ik denk dat het probleem met je code te maken heeft met de parameter 'query', omdat je een andere query maakt op een collectie zonder index.

UPDATE (met resultaten/statistieken):

db.runCommand( { dropDatabase: 1 } )

db.createCollection("places"); 

db.places.createIndex( { "locs.loc.coordinates" : "2dsphere" } )


function randInt(n) { return parseInt(Math.random()*n); }
function randFloat(n) { return Math.random()*n; }

for(var j=0; j<10; j++) {  
  print("Building op "+j);
  var bulkop=db.places.initializeOrderedBulkOp() ;
  for (var i = 0; i < 1000000; ++i) {
    bulkop.insert(    
      {
        locs: [
          {
            loc : { 
              type: "Point", 
              coordinates: [ randFloat(180), randFloat(90) ] 
            }
          },
          {
            loc : { 
              coordinates: [ randFloat(180), randFloat(90) ] 
            }
          }
        ]
      }  
    )
  };
  print("Executing op "+j);
  bulkop.execute();
}

Dit is de vraag:

db.runCommand(
   {
     geoNear: "places",
     near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
     spherical: true
   }
)

58ms:

2ms tweede run:

db.runCommand(
   {
     geoNear: "places",
     near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
     spherical: true,
     query: { category: "private" }
   }
)

156996ms:

Na het aanmaken van de "categorie" index:{ locs.loc.coordinates:"2dsphere", categorie:1 }

13562ms:

UPDATE: door "maxDistance" toe te voegen, kunt u 396ms . uitvoeren vs 6863ms

db.runCommand(
   {
     geoNear: "places",
     near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
     spherical: true,
     query: {category: "private"},
     maxDistance: 1000000
   }
)

maxAfstand:1000000

"stats" : {
    "nscanned" : NumberInt(107820), 
    "objectsLoaded" : NumberInt(1), 
    "avgDistance" : 938598.1782650856, 
    "maxDistance" : 938598.1782650856, 
    "time" : NumberInt(396)
}

zonder "maxDistance":

db.runCommand(
   {
     geoNear: "places",
     near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
     spherical: true,
     query: {category: "private"}
   }
)

"stats" : {
    "nscanned" : NumberInt(2023916), 
    "objectsLoaded" : NumberInt(6), 
    "avgDistance" : 3013587.205365039, 
    "maxDistance" : 4263919.742779636, 
    "time" : NumberInt(6863)
}

Bron:https://www.mongodb .com/blog/post/geospatial-performance-improvements-in-mongodb-3-2

Sterker nog, uw zoekopdracht gebruikt "een array van coördinaten" waarvan ik denk dat het nutteloos is omdat één object (over het algemeen) 1 geolocatiepunt heeft.

Een andere manier om te optimaliseren is het maken van "geoWithin " aangezien sorteert niet op "afstand" (misschien wilt u sorteren op "meest gestemde restaurant"). Afhankelijk van het scenario.




  1. Hoe verpak ik axios.get meerdere responsresultaten in één array?

  2. Hoe kan ik db.copyDatabase uitvoeren via NodeJS's MongoDB native driver?

  3. Hoe vind ik vergelijkbare documenten in MongoDB?

  4. Mongoose-indexering in productiecode