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
}
)
db.runCommand(
{
geoNear: "places",
near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
spherical: true,
query: { category: "private" }
}
)
Sau khi tạo chỉ mục "danh mục":{locs.loc.coosystem:"2dsphere", danh mục:1}
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.