MongoDB 3.4rc mit 2 Millionen Datensätzen
Ich denke, das Problem mit Ihrem Code hängt mit dem Parameter „query“ zusammen, weil Sie eine weitere Abfrage für eine Sammlung ohne Index durchführen.
UPDATE (mit Ergebnissen/Statistiken):
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();
}
Dies ist die Abfrage:
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" }
}
)
Nach dem Erstellen des „category“-Index:{ locs.loc.coordinates:„2dsphere“, category:1 }
AKTUALISIERUNG: Durch Hinzufügen von "maxDistance" können Sie 396ms ausführen gegenüber 6863 ms
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)
}
ohne "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)
}
Quelle:https://www.mongodb .com/blog/post/geospatial-performance-improvements-in-mongodb-3-2
Noch mehr verwendet Ihre Abfrage "ein Array von Koordinaten", das meiner Meinung nach nutzlos ist, da ein Objekt (im Allgemeinen) 1 Geolokalisierungspunkt hat.
Eine weitere Möglichkeit zur Optimierung besteht darin, "geoWithin ", da nicht nach "Entfernung" sortiert wird (vielleicht möchten Sie nach "meistbewertetes Restaurant" sortieren). Abhängig vom Szenario.