MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Índice Mongodb 2dsphere para campo de matriz aninhada


O documento que você forneceu parece bom para mim, também fiz um teste simples com uma versão curta do seu documento e funcionou para mim.
"_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"  } );

Portanto, sugiro verificar outros documentos da coleção, alguns deles podem estar malformados para o índice. Certifique-se também de que seus elementos de matriz de coordenadas não sejam strings. Como este documento não é válido para o índice 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"
                                    ]
                            }
                    }
            ]

Observe as aspas para os elementos de coordenadas que os tornam strings.

RESPOSTA AO COMENTÁRIO: O Mongo permite apenas um índice geoespacial por coleção. Portanto, você não precisa especificar todo o caminho do campo para o seu runCommand. O nome da coleção é suficiente. Isso deve funcionar para você se o nome da coleção for checkin_20140222
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})

Espero que ajude!