MongoDB-我如何创建索引有什么问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB-我如何创建索引有什么问题?相关的知识,希望对你有一定的参考价值。

我正在尝试使用Mongo的GeoSpatial功能根据坐标定位文档。我需要创建索引才能使其正常工作-但似乎无法创建索引?你能帮忙吗?

我将浏览到目前为止的内容。

//User saves the location using a PUT Command. 
props.updateBandLocation({
        geometry: { 
            type: "Point", 
            coordinates: [ lat, lon ] 
        }
    })

这里是将其放入数据库的路由。我尝试在这里创建索引。

router.put('/:id',    (req, res) => {
quoteGenerator.findByIdAndUpdate({_id: req.params.id}, req.body).then(() => {
    quoteGenerator.findOne({_id: req.params.id}).then(generator => res.send(generator))
    quoteGenerator.createIndex( { bandLocation: "2dsphere" } )
})

})

索引在我的终端中引发错误,但是无论如何都会创建位置。它在数据库中。

//How the query looks in the database
    "bandLocation": {
    "geometry": {
        "type": "Point",
        "coordinates": [
            32.96179,
            -96.82916850000001
        ]
    }
},

最后,我正在尝试使用此路线将所有文档移到某个点附近。

router.get('/allbands/:lat/:lng',   (req, res) => {
quoteGenerator.find(
    {
    bandLocation: 
        {   $near: {
                $geometry: {
                    type : "Point",
                    coordinates : [-req.params.lng, +req.params.lat],
                }
            }
        }
    }

  ).then(bands => res.json(bands))

});

感谢您提供的任何帮助!

这是我的架构-

    //Create GeoSchema 

const GeoSchema = new Schema({
    geometry: {
        type: {
            type: String,
            default: "Point",
            index: "2dsphere",

        },
        coordinates: {
            type: [Number],
        },
    } 
})

//Create Schema - Band
const AutoQuoteGeneratorSchema = new Schema({
    baseCost: {
        type: Number
    },
    mainDate: {
        type: Object
    },
    quoteGenerator: {
        type: Array,
        required: true,
    },
    userId: {
        type: String,
        required: true,
    },
    type: {
        type: String,
        required: true,
    },
    bandName: {
        type: String,
        required: true,
    },
    bandBio: {
        type: String,
        required: true,
    },
    bandLocation: GeoSchema,
    bandTour: {
        type: Array,
        required: true,
    },
    bandGenre: {
        type: String,
        required: true,
    },
    youtube: {
        type: Array,
        required: true,
    },
    published: {
        type: Boolean,
        required: true,
    },
    posts: {
        type: Array,
        required: true,
    },
});
答案

好吧,据我所知,我们有两个问题:

  1. 结构:

从2dsphere索引docs

2dsphere索引支持存储为GeoJSON对象和旧式坐标对的数据

GeoJSON对象是什么类型?它们是{ type: <GeoJSON type> , coordinates: <coordinates> }

legacy coordinates pairs是什么类型?它们的形式为:[<longitude>, <latitude> ]{ <field1>: <x>, <field2>: <y> }

所以我们可以看到bandLocation都不是,您需要使用

quoteGenerator.createIndex( { "bandLocation.geometry": "2dsphere" } )
  1. 您的坐标顺序错误,您需要按经度然后按纬度的顺序指定。以度为单位的有效纬度范围是-90和+90。您的-96纬度值超出范围。因此,将您的文档更改为[-96.82916850000001, 32.96179]

  2. 现在我们只需要调整您的查询:

quoteGenerator.find({
    "bandLocation.geometry": 
        {   $near: {
                $geometry: {
                    type : "Point",
                    coordinates : [-req.params.lng, +req.params.lat],
                }
            }
        }
    })

**弹出的另一件事是,实际上每次有一个函数调用时,您都会创建(尝试创建)索引,实际上您应该只执行一次。它不应该是您代码的一部分。现在这不会引发错误,但是由于Mongo在更改/插入时自动建立索引文件,因此是多余的。

以上是关于MongoDB-我如何创建索引有什么问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确创建索引 mongodb?

用javascript索引一个mongodb

MongoDB - 如何提高创建索引的性能?

如何在 Robo 3T(原 Robomongo)中创建 Mongodb 索引?

一日一技:MongoDB如何正确中断正在创建的索引

如何通过 .NET 在 MongoDB 中创建索引