MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

bagaimana cara menggunakan mongoDB sebagai mesin pencari?

MongoDB 3.4rc dengan 2 juta catatan

Saya pikir masalah dengan kode Anda terkait dengan parameter 'kueri', karena Anda membuat kueri lain pada Koleksi tanpa indeks.

PERBARUI (dengan hasil/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();
}

Ini pertanyaannya:

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

58 md:

2 md detik berjalan:

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

156996md:

Setelah membuat indeks "kategori":{ locs.loc.coordinates:"2dsphere", kategori:1 }

13562md:

PERBARUI: dengan menambahkan "maxDistance" Anda dapat melakukan 396 md vs 6863md

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

jarak maks:1000000

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

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

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

Terlebih lagi kueri Anda menggunakan "array koordinat" yang menurut saya tidak berguna karena satu objek (umumnya) memiliki 1 titik geolokasi.

Cara lain untuk mengoptimalkan adalah membuat "geoWithin " karena tidak mengurutkan berdasarkan "jarak" (mungkin Anda ingin mengurutkan berdasarkan "restoran yang paling banyak dipilih"). Tergantung dari skenarionya.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. db.collectionNames tidak berfungsi di Node.js

  2. Format dokumen yang efisien untuk menyimpan Suara di Mongo DB?

  3. Validasi luwak:diperlukan:salah, validasi:regex, masalah dengan nilai kosong

  4. Mongoengine:ConnectionError:Anda belum menentukan koneksi default

  5. Bagaimana cara membuat bidang Tanggal dengan nilai default sebagai stempel waktu saat ini di MongoDb?