2016-07-13 5 views
0

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.

Antwort

3

Ok, also ich denke, ich habe es gefunden.

Offenbar um die Überlastung von NearSphere() verwenden, die zwei Argumente als verdoppelt akzeptiert nicht, arbeiten

NearSphere(room => room.RoomLocation, location.Longitude, location.Latitude, i_SearchRadius); 

Aber Wechsel in die Überlastung, die mit einem GeoJson2DGeographicCoordinates ein GeoJsonPoint Objekt akzeptiert als der generische Typ macht es Arbeit richtig. Gefällt mir:

NearSphere(room => room.RoomLocation, GeoJson.Point<GeoJson2DGeographicCoordinates(new GeoJson2DGeographicCoordinates(location.Longitude, location.Latitude)), i_SearchRadius); 

Nur für zukünftige Referenz.

Verwandte Themen