2012-04-04 11 views
4

Ich versuche eine Near-Abfrage mit einem MaxDistance in einem MongoMapper-Modell zu kapseln.MongoMapper in der Nähe von MaxDistance - Mongo :: OperationFailure: Geo-Werte müssen Zahlen sein:

Ich muss etwas Dummes in meiner Abfrage-Syntax tun.

Modell

class Site 
    include MongoMapper::Document 

    key :id, Integer 
    key :name, String 
    key :location, Array 
    ensure_index [[:location, '2d']] 


    def self.nearest(center_point, range) 
    where(:location => {'$near' => center_point, '$maxDistance' => range}).all 
    end 

end 

Der Versuch, alles im Umkreis von 200 Meilen von einem Punkt zu kommen ...

Site.nearest ([- 122.0,44.0], 200)

> Mongo::OperationFailure: geo values have to be numbers: { 
> $maxDistance: 200, $near: [ -122.0, 44.0 ] } from 
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:144:in 
> `next' from 
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:290:in 
> `each' from 
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:308:in 
> `to_a' from 
> /Library/Ruby/Gems/1.8/gems/mongo-1.6.1/lib/mongo/cursor.rb:308:in 
> `to_a' from 
> /Library/Ruby/Gems/1.8/gems/plucky-0.4.4/lib/plucky/query.rb:74:in 
> `all'  from /Users/nick/Code/web/map/app/models/site.rb:40:in 
> `nearest'  from (irb): 

Antwort

1

Ich vermute, dass es sich um ein Datenproblem oder ein Indexproblem handelt, Ihre Abfrage sieht korrekt aus.

Siehe http://www.mongodb.org/display/DOCS/Geospatial+Indexing ... MaxDistance von 200 kann zu groß sein:

standardmäßig der Index vorausgesetzt, dass Sie Länge/Breite indizieren und ist somit für einen [-180..180) Wertebereich konfiguriert .

Die Entfernungseinheit ist die gleiche wie in Ihrem Koordinatensystem.

Versuchen Sie auch Site.distinct(:location) und suchen Sie nach nicht numerischen Daten. (oder Site.query.distinct(:location), wenn Sie nicht auf MM 0.11.1 sind).

Tipp: Wenn Sie sehen wollen, was eine Abfrage wie aussehen wird, wenn es trifft MongoDB, fügen .criteria.to_hash:

Site.where(:location => {'$near' => center_point, '$maxDistance' => range}).criteria.to_hash 
# => 
{ 
    :location=> { 
    "$near"  => [-122.0, 44.0], 
    "$maxDistance" => 200 
    } 
} 
12

Sie haben vielleicht in this bug ausführen, die mit $maxDistance$near und $maxDistance bestellt werden muss zuerst.

In jedem Fall habe ich diese Frage gefunden, weil ich OperationFailure: database error: geo values have to be number bei der Verwendung von PyMongo bekam, und die Reihenfolge vertauschte es behoben.

+0

Dieser Fix arbeitete auch für mich. Danke, dass du mir etwas Zeit für diese Sache gespart hast. – Alice

1

Hier ist eine andere Lösung for this one

{'location' : SON([('$near', [55.55632, 25.13522]), ('$maxDistance', 0.01)])}) 
0

diesen Fehler bekam mit in Session gespeicherten Daten (verschiedene Wahlen, php + ZF2): eine floatval (lat), floatval (lon) löste das Problem :) I‘ Ich poste es für den Fall, dass jemand es braucht :)