Consulta geo-espacial con clasificación y límite en un campo secundario -- mongodb campo con sorting campo con limit campo con geospatial camp Relacionados El problema

geo-spatial query with sort and limit on a secondary field


1
vote

problema

Español

Estoy tratando de obtener las 3 cuentas más recientemente creadas en el área cercana. Así que intenté usar una consulta geomaterial combinada con un tipo (creado_at: -1) y límite (3)

La consulta geomepatial básica:

  db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}) { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" } { "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" } { "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" } { "created_at" : ISODate("2014-03-05T12:01:34.199Z"), "name" : "D" } { "created_at" : ISODate("2014-03-13T08:16:22.913Z"), "name" : "E" } { "created_at" : ISODate("2014-03-13T10:23:02.660Z"), "name" : "F" }   

Agregar ordenación a TI dio:

  db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}).sort({created_at: -1}) { "created_at" : ISODate("2014-03-13T10:23:02.660Z"), "name" : "F" } { "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" } { "created_at" : ISODate("2014-03-13T08:16:22.913Z"), "name" : "E" } { "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" } { "created_at" : ISODate("2014-03-05T12:01:34.199Z"), "name" : "D" } { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" }   

y finalmente agregando un límite dio:

  db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}).sort({created_at: -1}).limit(3) { "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" } { "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" } { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" }   

El resultado esperado fue [F, C, E] (es decir, las primeras 3 entradas de la segunda consulta-resultado). Pero en su lugar me siento [C, B, A], que son las primeras 3 entradas de la primera consulta (ordenada por la hora de la creación).

SO MONGODB está realizando la operación de límite antes de realizar la operación de clasificación. ¿Hay alguna manera de forzarlo a ordenar antes de aplicar el límite?

Se solicitó una pregunta similar Aquí , pero hubo un problema en la consulta en sí. ¿Este problema es específico de las consultas de '$ cerca'?

Original en ingles

I am trying to obtain the most recently created 3 accounts in the nearby area. So I tried to use a geo-spatial query combined with a sort(created_at: -1) and limit(3)

The basic geo-spatial query:

db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}) { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" } { "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" } { "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" } { "created_at" : ISODate("2014-03-05T12:01:34.199Z"), "name" : "D" } { "created_at" : ISODate("2014-03-13T08:16:22.913Z"), "name" : "E" } { "created_at" : ISODate("2014-03-13T10:23:02.660Z"), "name" : "F" } 

Adding sorting to it gave:

db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}).sort({created_at: -1}) { "created_at" : ISODate("2014-03-13T10:23:02.660Z"), "name" : "F" } { "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" } { "created_at" : ISODate("2014-03-13T08:16:22.913Z"), "name" : "E" } { "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" } { "created_at" : ISODate("2014-03-05T12:01:34.199Z"), "name" : "D" } { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" } 

And finally adding a limit gave:

db.users.find({"loc": {$near: [28.41, 77.04], $maxDistance:0.05, $uniqueDocs: true}}).sort({created_at: -1}).limit(3) { "created_at" : ISODate("2014-03-13T08:28:46.285Z"), "name" : "C" } { "created_at" : ISODate("2014-03-08T10:00:17.921Z"), "name" : "B" } { "created_at" : ISODate("2013-12-11T07:58:34.927Z"), "name" : "A" } 

The expected result was [F,C,E] (i.e the first 3 entries from the second query-result). But instead I get [C,B,A], which is the first 3 entries from the first query-result (sorted by creation time).

So mongodb is performing the limit operation before it performs the sort operation. Is there any way to force it to sort before applying the limit ?

A similar question was asked here, but there was an issue in the query itself. Is this issue specific to '$near' queries ?

           

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

The geo-spatial Query ya ordenadores Los documentos de más cercanos a más lejanos . Por lo tanto, si tiene un tipo adicional () y límite (), se aplica primero el límite () primero, ya que los resultados ya están ordenados por distancia.

Aunque creo que no tiene mucho sentido ordenar "creado" en una consulta geo-espacial, si aún lo necesita, solo se puede hacer programáticamente. Es decir, ordena los resultados completos en la consulta y aplicar el límite en su programa cliente.

 

The geo-spatial query already sorts the documents from nearest to farthest. So, if you have an additional sort() and limit(), limit() is applied first since the results are already sorted by distance.

Although I think it doesn't make much sense to sort by "created_at" in a geo-spatial query, if you still need it, it can only be done programmatically. That is, sort the entire results in the query and apply the limit in your client program.

 
 
   
   

Relacionados problema

1  ¿Cómo agregar una sola barra de color representativa para múltiples subplots espaciales en Matlab?  ( How to add a single representative color bar for multiple spatial subplots in ma ) 
Esta pregunta es vagamente contestada en otro lugar. Por lo tanto, por favor, responda antes de bajarlo y marcarlo como duplicado. He buscado StackOverflow ...

4  Mapa de r: ¿Cómo llenamo las regiones?  ( R map how do i fill the regions ) 
Estoy planeando un mapa aquí y no puedo llenarlo bien, espero que puedas ayudarlo. Entonces, ¿qué hago? Leer el mapa y cambiar la proyección: map<-readOG...

1  Convertir las coordenadas XY en relación con los píxeles a la latitud y la longitud  ( Converting xy coordinates in relation to pixels to latitude and longitude ) 
Aquí está mi situación: La compañía con la que trabajo está utilizando un software de terceros que constituye la ubicación de los dispositivos en una red WiF...

3  ¿Cómo calcular la distancia entre dos coordenadas (sin flotadores)?  ( How to calculate distance between two coordinates without floats ) 
Necesito calcular la distancia entre dos coordenadas (LON, LAT) en el sistema integrado que no tiene tipo de punto flotante (solo enteros disponibles, por lo ...

0  ¿Cómo usar la función de la parcela () para ampliar los países, el mapa, agregar datos geoespaciales junto con una escala de color y una leyenda para un gran estructura de datos en R?  ( How to use plot function to zoom on countries map add geospatial data along ) 
Tengo un gran conjunto de datos (& gt; 2000 puntos) de las coordenadas GPS globales y los valores de LC para cada coordenada. Un ejemplo de los datos se muest...

0  Polígono en Readwkt ("Polígono (((.))") Función en paquete rgeos  ( Polygon in readwktpolygon function in rgeos package ) 
Consideremos un polígono 2-D (X) con un número suficientemente grande de (digamos 20) vértices: { id:"20020-278", price: 119, quantity: 1}, { id:"20009-129...

0  MySQL Interpret Function Function Llamada como llamada de función Schema (código de error 1305: la función no existe)  ( Mysql interprets system function call as schema function call error code 1305 ) 
Mi problema es que MySQL detecta la llamada de mi función como algo así como una llamada de procedimiento almacenado de esquema local. No estoy seguro de cómo...

6  Scaling D3.js Proyecciones  ( Scaling d3 js projections ) 
Estoy tratando de dibujar un mapa de NYC usando D3. He descargado un montón de shapefiles de http://www.nyc. GOV / HTML / DCP / HTML / BYTES / DWNDistricts.s...

0  Tengo los límites del país. ¿Cómo me llené con puntos?  ( I the have country boundaries how do i fill in with dots ) 
Tengo los límites de mi país lat / largos de koordinates.com. Ahora quiero rellenar el interior con puntos. Dado que el archivo que tengo es kml, estaba pen...

8  Aprende GIS con Python [cerrado]  ( Learn gis with python ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos