sql >> Database teknologi >  >> NoSQL >> MongoDB

hvordan bruger man mongoDB som søgemaskine?

MongoDB 3.4rc med 2 mio. poster

Jeg tror, ​​at problemet med din kode er relateret til "forespørgsel"-parameteren, fordi du laver en anden forespørgsel på en samling uden et indeks.

OPDATERING (med resultater/statistik):

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

Dette er forespørgslen:

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

58 ms:

2ms anden kørsel:

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

156996 ms:

Efter oprettelse af "category"-indeks:{ locs.loc.coordinates:"2dsphere", kategori:1 }

13562 ms:

OPDATERING: ved at tilføje "maxDistance" kan du udføre 396ms vs 6863ms

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

maxDistance:1000000

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

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

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

Endnu mere bruger din forespørgsel "en række koordinater", som jeg synes er ubrugelig, da ét objekt (generelt) har 1 geolokationspunkt.

En anden måde at optimere på er at lave "geoWithin " siden sorterer ikke efter "afstand" (måske vil du sortere efter "mest stemte restaurant"). Afhængigt af scenariet.




  1. Er det muligt at få et enkelt resultat samlet?

  2. Sailsjs - Brugerdefineret logning med Winston

  3. MongoDB grupper efter array indre-elementer

  4. Hvordan opdaterer man undersæt af en streng i MongoDB?