Mongodb:在两个字段的数组上创建索引
Mongodb: Create index on array of two fields
我有一个 MongoDB 集合,其中存储位置数据如下:
{
...
longitude: "-73.985679",
latitude: "40.75003",
...
}
我需要为这些创建一个 2dsphere 索引。有没有办法将这两个单独的字段组合成 GeoJSON 格式的数组?
2dsphere 索引的唯一有效形式是 GeoJSON 对象或遗留坐标对。后一种形式是单个字段上的数组或带有 "lat" 和 "lon" 键的子文档。
您最好在文档中转换此信息以供持续使用,并使用 GeoJSON 格式。最好和最安全的方法是使用 Bulk 操作 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()
循环一次,这将 运行 循环更快,但不一定 "safer"。
一旦完成,只需在文档中的 "location" 字段上创建索引即可:
db.collection.ensureIndex({ "location": "2dsphere" })
然后您可以在查询中使用该索引。
但是您需要更改文档中的结构,所以请正确执行。
我有一个 MongoDB 集合,其中存储位置数据如下:
{
...
longitude: "-73.985679",
latitude: "40.75003",
...
}
我需要为这些创建一个 2dsphere 索引。有没有办法将这两个单独的字段组合成 GeoJSON 格式的数组?
2dsphere 索引的唯一有效形式是 GeoJSON 对象或遗留坐标对。后一种形式是单个字段上的数组或带有 "lat" 和 "lon" 键的子文档。
您最好在文档中转换此信息以供持续使用,并使用 GeoJSON 格式。最好和最安全的方法是使用 Bulk 操作 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()
循环一次,这将 运行 循环更快,但不一定 "safer"。
一旦完成,只需在文档中的 "location" 字段上创建索引即可:
db.collection.ensureIndex({ "location": "2dsphere" })
然后您可以在查询中使用该索引。
但是您需要更改文档中的结构,所以请正确执行。