sql >> Base de Datos >  >> NoSQL >> MongoDB

más de un índice de 2dsphere, no estoy seguro de cuál ejecutar geoNear

Como indica el mensaje de error, esto se debe a que tiene más de un 2dsphere índices, entonces $geoNear no sabe cuál usar.

En esta situación, puede:

  • soltar el segundo índice geográfico, o
  • usa la key como se menciona en la documentación de $geoNear :

El error también se menciona en los documentos:

Puede usar db.collection.getIndexes() para enumerar todos los índices definidos en la colección.

Aquí hay un ejemplo del uso de la tecla key parámetro:

> db.test.insert([
  {_id:0, loc1:{type:'Point',coordinates:[1,1]}, loc2:{type:'Point',coordinates:[2,2]}},
  {_id:1, loc1:{type:'Point',coordinates:[2,2]}, loc2:{type:'Point',coordinates:[1,1]}}
])

Luego creo dos 2dsphere índices:

> db.test.createIndex({loc1:'2dsphere'})
> db.test.createIndex({loc2:'2dsphere'})

Ejecutando $geoNear sin especificar key generará el error:

> db.test.aggregate({$geoNear:{near:{type:'Point',coordinates:[0,0]},distanceField:'d'}})
...
  "errmsg": "more than one 2dsphere index, not sure which to run geoNear on",
...

Usando la tecla key: loc1 ordenará el resultado según el loc1 índice (_id: 0 viene antes de _id: 1 ):

> db.test.aggregate(
    {$geoNear: {
        near: {type: 'Point',coordinates: [0,0]},
        distanceField: 'd',
        key: 'loc1'}})
{ "_id": 0, "loc1": { "type": "Point", "coordinates": [ 1, 1 ] }, "loc2": { "type": "Point", "coordinates": [ 2, 2 ] }, "d": 157424.6238723255 }
{ "_id": 1, "loc1": { "type": "Point", "coordinates": [ 2, 2 ] }, "loc2": { "type": "Point", "coordinates": [ 1, 1 ] }, "d": 314825.2636028646 }

Y, usando la tecla key: loc2 ordenará el resultado según el loc2 índice (_id: 1 viene antes de _id: 0 ):

> db.test.aggregate(
    {$geoNear: {
        near: {type: 'Point',coordinates: [0,0]},
        distanceField: 'd',
        key: 'loc2'}})
{ "_id": 1, "loc1": { "type": "Point", "coordinates": [ 2, 2 ] }, "loc2": { "type": "Point", "coordinates": [ 1, 1 ] }, "d": 157424.6238723255 }
{ "_id": 0, "loc1": { "type": "Point", "coordinates": [ 1, 1 ] }, "loc2": { "type": "Point", "coordinates": [ 2, 2 ] }, "d": 314825.2636028646 }