sentencias - MongoDB ''no se puede encontrar el índice para la consulta $ geoNear''
mongodb tutorial español (4)
Pocos problemas, creó sus índices en la colección foo de la base de datos foo, pero está consultando la colección de barras . Debe estar en la colección correcta.
Al leer el documento que ha insertado, debe agregar un índice "2dsphere" para admitir los objetos geoJson . Este índice debe estar en el elemento "punto" de sus documentos, así que intente
db.bar.createIndex({point:"2dsphere"});
A continuación, puede consultar de la siguiente manera proporcionando un obj geoJson para la consulta:
db.bar.find(
{ point :
{ $near :
{
$geometry : {
type : "Point" ,
coordinates : [-84.27326978424058, 30.443902444762696] },
$maxDistance : 1
}
}
}
)
Solo estoy tratando de hacer funcionar una consulta simple y near
. Aquí hay una muestra de mi documento.
{"point":
{"type": "Point",
"coordinates": [30.443902444762696, -84.27326978424058]},
"created_on": {"$date": 1398016710168},
"radius": 180,
"user": {"$oid": "53543188eebc5c0cc416b77c"},
"_id": {"$oid": "53544306eebc5c0ecac6cfba"},
"expires_on": {"$date": 1399831110168}
}
y con mongod probé el comando:
db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}});
pero obtengo este error:
error: {"$ err": "No se puede ejecutar la consulta: consulta de procesamiento de error: ns = foo.bar skip = 0 / nTree: GEONEAR campo = punto maxdist = 1.79769e + 308 isNearSphere = 0 || Primero: notFirst: ruta completa : point / nSort: {} / nProj: {} / n el planificador devolvió el error: no se pudo encontrar el índice para la consulta $ geoNear "," código ": 17007}
Tal vez mi google fu no sea tan nítido hoy, pero no pude encontrar nada. Además, ejecuté el comando asegurar índice. Mi intención es que estas sean ubicaciones de mapas.
db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});
db.prod.createIndex({ "location": "2d" })
Esto solucionó el mismo problema para mí.
Donde prod es el nombre de mi colección y la ubicación es el nombre de la columna que almacena la ubicación geográfica (GeoPoint)
Alguna discusión sobre lo mismo se puede encontrar aquí
Además de las respuestas anteriores, si ya ha intentado crear un índice y ha obtenido una sintaxis o campo incorrecto, puede ejecutar
db.<yourcollection>.dropIndexes();
Para limpiar todos los índices y volver a crearlos correctamente.
Además, el índice debe crearse en el padre de "coordenadas", no en las coordenadas en sí:
{
"_id": 59ac03d168eaaa14c2a57a00",
"location":{
"type":"Point",
"coordinates":[
131.6667,
57.8368
]
},
"age":53,
"username":"Brandi_Greenfelder"
}
db.<yourcollection>.createIndex({ location: ''2dsphere'' });
Atención, hay "2d" y "2dsphere", usa el segundo porque es lo nuevo.
Entonces parece que hay un par de cosas mal aquí:
- A partir de los datos que está mostrando y también su información de consulta, la información relevante está contenida debajo del punto de campo y en formato GeoJSON. Su creación de índice:
db.foo.createIndex({geo: "2d"})
No "falla" porque actualmente no hay un campo llamado "geo" y el campo con los datos debería haber estado en ese lugar. Si hubiera usado "punto" en su lugar, que es el campo correcto, entonces habría recibido un error al decirle que este tipo de índice no es válido para los datos de GeoJSON. Necesita un índice de "2dsphere":
db.points.createIndex({ "point": "2dsphere" })
- Extendiendo el mismo problema, nuevamente los datos están en formato GeoJSON y la forma de la consulta es la de un par de coordenadas heredado. Debe cambiar los argumentos de la consulta para que no fallen más:
db.points.find({point: { $near: { $geometry:{ type: "Point", coordinates: [-84.26060492426588, 30.45023887165371] } } }})
Ver la documentación de $near