MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

plus d'un index 2dsphere, pas sûr lequel exécuter geoNear

Comme l'indique le message d'erreur, c'est parce que vous avez plus d'un 2dsphere index, donc $geoNear ne sait pas lequel utiliser.

Dans cette situation, vous pouvez soit :

  • supprimer le deuxième index géographique, ou
  • utiliser la key paramètre comme mentionné dans la documentation $geoNear :

L'erreur est également mentionnée dans la documentation :

Vous pouvez utiliser db.collection.getIndexes() pour lister tous les index définis sur la collection.

Voici un exemple d'utilisation de la key paramètre :

> 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]}}
])

Ensuite, je crée deux 2dsphere index :

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

Exécution de $geoNear sans spécifier la key affichera l'erreur :

> 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",
...

Utilisation de la key: loc1 triera le résultat selon le loc1 index (_id: 0 vient avant _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 }

Et, en utilisant la key: loc2 triera le résultat selon le loc2 index (_id: 1 vient avant _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 }