Come eseguire una query di intersezione o sovrapposizione nella shell di mongo: quali cerchi si sovrappongono alla mia area di ricerca? Within
si riferiscono solo alla posizione centrale ma non includono il raggio degli altri cerchi nella portata cercata.Come trovare tutti i cerchi sovrapposti dal raggio del cerchio centrale?
Mongo:
# My bad conception:
var search = [[30, 30], 10]
db.places.find({circle : {"$within" : {"$center" : [search]}}})
Ora posso ottenere solo questo circoli all'interno punto centrale si trova nella zona cercato di circolo:
Rubino:
# field :circle, type: Circle # eg. [ [ 30, 30 ], 10 ]
field :radius, type: Integer
field :location, :type => Array, :spatial => true
spatial_index :location
Places.within_circle(location: [ [ 30, 30 ], 10 ])
# {"$query"=>{"location"=>{"$within"=>{"$center"=>[[30, 30], 10]}}}
ho creato i dati di esempio con posizione aggiuntiva (indice speciale) e raggio invece cerchio perché il cerchio non è supportato da mongodb geo index:
{ "_id" : 1, "name" : "a", "circle" : [ [ 5, 5 ], 40 ], "latlng" : [ 5, 5 ], "radius" : 40 }
{ "_id" : 2, "name" : "b", "circle" : [ [ 10, 10 ], 5 ], "latlng" : [ 10, 10 ], "radius" : 5 }
{ "_id" : 3, "name" : "c", "circle" : [ [ 20, 20 ], 5 ], "latlng" : [ 20, 20 ], "radius" : 5 }
{ "_id" : 4, "name" : "d", "circle" : [ [ 30, 30 ], 50 ], "latlng" : [ 30, 30 ], "radius" : 50}
{ "_id" : 5, "name" : "e", "circle" : [ [ 80, 80 ], 30 ], "latlng" : [ 80, 80 ], "radius" : 30}
{ "_id" : 6, "name" : "f", "circle" : [ [ 80, 80 ], 20 ], "latlng" : [ 80, 80 ], "radius" : 20}
desiderata risultato della query:
{ "_id" : 1, "name" : "a", "circle" : [ [ 5, 5 ], 40 ], "latlng" : [ 5, 5 ], "radius" : 40 }
{ "_id" : 3, "name" : "c", "circle" : [ [ 20, 20 ], 5 ], "latlng" : [ 20, 20 ], "radius" : 5 }
{ "_id" : 4, "name" : "d", "circle" : [ [ 30, 30 ], 50 ], "latlng" : [ 30, 30 ], "radius" : 50}
{ "_id" : 5, "name" : "e", "circle" : [ [ 80, 80 ], 30 ], "latlng" : [ 80, 80 ], "radius" : 30}
soluzione qui di seguito presuppone che ricevo tutte le righe e poi filtrare sul lato rubino il mio raggio ma restituisce solo:
{ "_id" : 4, "name" : "d", "circle" : [ [ 30, 30 ], 50 ], "latlng" : [ 30, 30 ], "radius" : 50}
Penso che si desidera tornare "a" , "c" e "d". "e" non si sovrappone alla tua cerchia. –
Non ho potuto verificare il mio codice la prima volta che ho risposto. Controllato e riparato ora. Puoi vedere da solo. Come disse Asya Kamsky, ti aspetti solo a, c, d. Altrimenti le informazioni che ci hai fornito sono sbagliate. – oldergod
In realtà ho fatto un errore alla "e". Entrambe le soluzioni sono buone, ma ora vedo che per il momento attuale userò il rubino. Ho paura che su dischi di dimensioni maggiori il mio programma potrebbe non funzionare troppo velocemente, quindi ho chiesto anche l'approccio in mongo. Grazie! – roza