Ich habe dieses seltsame Problem, wenn ich Mongo verwende, um Orte in der Nähe eines geografischen Punktes abzufragen. Ich stelle fest, dass der Filter nur dann alle Übereinstimmungen zurückgibt, wenn ich versuche, mit $ nearSphere über den C# -Treiber zu filtern, unabhängig davon, ob sie im angegebenen Bereich liegen oder nicht. Was ist seltsamer ist, dass die gleiche Abfrage in der Mongo-Shell selbst funktioniert und nur die richtigen Übereinstimmungen zurückgibt.GeoSpatial-Abfragen arbeiten in der Mongo-Shell, filtern aber nicht in C# -Treiber
z.
Ich habe ein paar Raumobjekte in der Datenbank, die das RoomLocation-Feld haben, das in der Datenbank als Typ definiert ist: Point (Erstellt im C# -Treiber als GeoJsonPoint-Objekt, das dann serialisiert wird). Diese Punkte haben die Koordinaten [0, 0] und [3, 3], und ich frage von [0, 0] mit einem maximalen Abstand von 3, also sollte der zweite Punkt nicht gefunden werden (Das sind geografische Orte, also
db.Rooms.find({
"RoomLocation":
{ $nearSphere:
{ $geometry: { type: "Point", coordinates: [0, 0]},
$maxDistance: 3
}
}
}
)
Welche funktioniert gut und liefert nur die [0, 0] Punkt: der Abstand sollte
die Abfrage ich renne ist ein gutes paar hundert Kilometer, schon gar nicht 3.) sein. Allerdings, wenn ich den folgenden Code in meinem C# Projekt laufen:
FilterDefinition<GameRoom> filter = Builders<GameRoom>.Filter
.NearSphere(room => room.RoomLocation, location.Longitude, location.Latitude, i_SearchRadius);
IFindFluent<GameRoom, String> gameModes = Mongo.Database.GetCollection<GameRoom>("Rooms")
.Find(filter)
.Project(room => room._id.ToString());
Und es nennen vor Ort = new GeoPoint (0, 0), i_SearchRadius = 3, auf die gleiche Art und Weise, wie ich in der Schale zu tun, Das Ergebnis dieser Abfrage enthält dann beide Punkte.
Der Index wird im Feld RoomLocation ordnungsgemäß eingerichtet.
Kann jemand irgendeinen offensichtlichen Fehler sehen, den ich hier mache? Da bin ich mir wirklich nicht sicher, was gerade los ist.
Danke.