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

时间:2015-01-03 06:13:03

标签: mongodb indexing mongodb-query geospatial

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

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

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

1 个答案:

答案 0 :(得分:5)

2dsphere索引的唯一有效形式是GeoJSON对象或遗留坐标对。后一种形式是单个字段上的数组或带有" lat"的子文档。和" lon"密钥。

您最好在文档中转换此信息以供持续使用,并使用GeoJSON格式。最好和最安全的方法是使用Bulk Operations API:

var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;

db.collection.find().forEach(function(doc) {
     bulk.find({ "_id": doc._id }).updateOne({
        "$set": {
            "location": {
                "type": "Point",
                "coordinates": [ doc.longitude, doc.latitude ]
            }
        },
        "$unset": {  "longitude": 1, "latitude": 1 } 
     });

     counter++;
     if ( counter % 1000 == 0 ) {
         bulk.execute();
         bulk = db.collection.initializeOrderedBulkOp();
     }

})

if ( counter % 1000 != 0 )
    bulk.execute();

你可以用eval()循环一次性工作,这将使循环更快但不一定更安全"。

一旦完成,只需在"位置"创建索引即可。文档中的新字段:

db.collection.ensureIndex({ "location": "2dsphere" })

然后您可以在查询中使用索引。

但是你需要改变文档中的结构,所以做对了。