Mongodb:在两个字段的数组上创建索引

Mongodb:在两个字段的数组上创建索引,mongodb,indexing,mongodb-query,geospatial,Mongodb,Indexing,Mongodb Query,Geospatial,我有一个MongoDB集合,其中存储的位置数据如下: { ... longitude: "-73.985679", latitude: "40.75003", ... } 我需要在这些上创建一个2dsphere索引。有没有办法将这两个单独的字段组合成GeoJSON格式的数组?2dsphere索引的唯一有效形式是作为GeoJSON对象或传统坐标对。后一种形式是单个字段上的数组或具有“lat”和“lon”键的子文档 您最好在文档中转换这些信息以供持续使用,并使用Ge

我有一个MongoDB集合,其中存储的位置数据如下:

{
    ...
    longitude: "-73.985679",
    latitude: "40.75003",
    ...
}

我需要在这些上创建一个2dsphere索引。有没有办法将这两个单独的字段组合成GeoJSON格式的数组?

2dsphere索引的唯一有效形式是作为GeoJSON对象或传统坐标对。后一种形式是单个字段上的数组或具有“lat”和“lon”键的子文档

您最好在文档中转换这些信息以供持续使用,并使用GeoJSON格式。执行此操作的最佳和最安全的方法是使用操作API:

var bulk=db.collection.initializeOrderedBulkOp();
var计数器=0;
db.collection.find().forEach(函数(doc){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$set”:{
“地点”:{
“类型”:“点”,
“坐标”:[doc.经度,doc.纬度]
}
},
“$unset”:{“经度”:1,“纬度”:1}
});
计数器++;
如果(计数器%1000==0){
bulk.execute();
bulk=db.collection.initializeOrderedBulkOp();
}
})
如果(计数器%1000!=0)
bulk.execute();
对于一次性作业,您可以使用
eval()
进行循环,这将使循环运行得更快,但不一定“更安全”

完成后,只需在文档中新的“位置”字段上创建索引:

db.collection.ensureIndex({“location”:“2dsphere”})
然后可以在查询中使用索引


但是您需要更改文档的结构,所以请正确操作。

谢谢!我想转变是唯一的办法。填充此数据的web应用程序将位置存储在单独的字段中。有什么方法可以在创建新文档时重新构造MongoDB本身的数据吗?@ZeMoon当然,使用原始结构创建文档的任何代码都应该更改,因此您必须解决这个问题,这应该是一个相当小的更改。这似乎是人们需要习惯结构化文档方法而不是RDBMS的“表格”方法的原因之一。非常好。再次感谢@ZeMoon您可以用任何语言编写代码。每个可用的驱动程序都有支持批量操作API的功能,甚至只支持基本的循环和更新。非常好的解决方案,谢谢。注:未设置行上的“纬度”应为“纬度”,如果(计数器%1000!=0)(很抱歉,我无法编辑,因为显然我必须更改6个字符),则最终检查应为