MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

làm thế nào để sử dụng mongoDB làm công cụ tìm kiếm?

MongoDB 3.4rc với 2 triệu bản ghi

Tôi nghĩ rằng vấn đề với mã của bạn có liên quan đến tham số 'truy vấn', bởi vì bạn đang thực hiện một truy vấn khác trên Bộ sưu tập mà không có chỉ mục.

CẬP NHẬT (với kết quả / số liệu thống kê):

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

Đây là truy vấn:

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

58 mili giây:

2ms giây chạy:

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

156996ms:

Sau khi tạo chỉ mục "danh mục":{locs.loc.coosystem:"2dsphere", danh mục:1}

13562 mili giây:

CẬP NHẬT: bằng cách thêm "maxDistance", bạn có thể thực hiện 396ms so với 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)
}

không có "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)
}

Nguồn: https://www.mongodb .com / blog / post / geospatial-performance-results-in-mongodb-3-2

Thậm chí nhiều truy vấn của bạn đang sử dụng "một mảng tọa độ" mà tôi nghĩ là vô ích vì một đối tượng (nói chung) có 1 điểm định vị.

Một cách khác để tối ưu hóa là tạo " geoWithin "vì không sắp xếp theo" khoảng cách "(có thể bạn muốn sắp xếp theo" nhà hàng được bình chọn nhiều nhất "). Tùy theo tình huống.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tìm kiếm toàn văn bằng Pymongo

  2. MongoDB c # driver:So sánh phân biệt chữ hoa chữ thường bằng cách sử dụng trong hoặc chứa trong danh sách bằng linq

  3. Meteor $ và với $ hoặc

  4. Cách hợp nhất tài liệu khi nhập tệp vào MongoDB

  5. Cách sắp xếp kết quả theo độ dài chuỗi trên MongoDB