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
}
)
db.runCommand(
{
geoNear: "places",
near: { type: "Point", coordinates: [ 73.9667, 40.78 ] },
spherical: true,
query: { category: "private" }
}
)
Na het aanmaken van de "categorie" index:{ locs.loc.coordinates:"2dsphere", categorie:1 }
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.