Como a mensagem de erro indicou, isso ocorre porque você tem mais de um
2dsphere
índices, então $geoNear
não sabe qual usar. Nessa situação, você pode:
- descarte o segundo índice geográfico ou
- use a
key
parâmetro conforme mencionado na documentação do $geoNear :
O erro também é mencionado nos documentos:
Você pode usar db.collection.getIndexes() para listar todos os índices definidos na coleção.
Aqui está um exemplo de como usar a
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]}}
])
Então eu crio dois
2dsphere
índices:> db.test.createIndex({loc1:'2dsphere'})
> db.test.createIndex({loc2:'2dsphere'})
Executando
$geoNear
sem especificar key
vai gerar o erro:> 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 a
key: loc1
classificará o resultado de acordo com o loc1
índice (_id: 0
vem 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 }
E, usando
key: loc2
classificará o resultado de acordo com o loc2
índice (_id: 1
vem 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 }