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

Index Mongodb 2dsphere pour le champ de tableau imbriqué

Le document que vous avez fourni me semble bon, j'ai aussi fait un test simple avec une version courte de votre document et cela fonctionne pour moi.

"_id" : ObjectId("530cb07c009d8c323b477957"),
        "time_from" : ISODate("2014-02-25T15:02:20.714Z"),
        "checkin" : [
                {
                        "user_id" : 1,
                        "loc" : {
                                "type" : "Point",
                                "coordinates" : [
                                        73.43,
                                        42.22
                                ]
                        }
                }
        ]

db.testGeo.ensureIndex( { "checkin.loc" : "2dsphere"  } );

Je suggère donc de vérifier d'autres documents de la collection, certains d'entre eux pourraient être malformés pour l'index. Assurez-vous également que les éléments de votre tableau de coordonnées ne sont pas des chaînes. Parce que ce document n'est pas valide pour l'index 2dsphere :

"_id" : ObjectId("530cb07c009d8c323b477957"),
            "time_from" : ISODate("2014-02-25T15:02:20.714Z"),
            "checkin" : [
                    {
                            "user_id" : 1,
                            "loc" : {
                                    "type" : "Point",
                                    "coordinates" : [
                                            "73.43",
                                            "42.22"
                                    ]
                            }
                    }
            ]

Veuillez noter les guillemets pour les éléments de coordonnées, ce qui en fait des chaînes.

RÉPONSE AU COMMENTAIRE : Mongo n'autorise qu'un seul index géospatial par collection. Vous n'avez donc pas à spécifier le chemin de champ complet pour votre runCommand. Le nom de la collection est suffisant. Cela devrait fonctionner pour vous si le nom de la collection est checkin_20140222

db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})

J'espère que cela vous aidera !