我正在做一个项目,我们将用d3.js将美国的航班可视化一个月。
我刚接触MongoDB中的大型数据库,刚开始考虑索引我的数据库以改进查询。
我有一个大型数据库(约655000行),其中包含2016年3月起在美国的所有航班,格式为:
"_id" : ObjectId("58b5fdf5fa5bf5750f9a34b4"),
"MONTH" : 3,
"DAY_OF_MONTH" : 1,
"DAY_OF_WEEK" : 2,
"FL_DATE" : "2016-03-01",
"CARRIER" : "AA",
"TAIL_NUM" : "N793AA",
"FL_NUM" : 1,
"ORIGIN" : "JFK",
"DEST" : "LAX",
"CRS_DEP_TIME" : 900,
"DEP_TIME" : 852,
"DEP_DELAY" : -8,
"DEP_DELAY_NEW" : 0,
"CRS_ARR_TIME" : 1234,
"ARR_TIME" : 1214,
"ARR_DELAY" : -20,
"ARR_DELAY_NEW" : 0,
"CANCELLED" : 0,
"CANCELLATION_CODE" : "",
"CRS_ELAPSED_TIME" : 394,
"ACTUAL_ELAPSED_TIME" : 382,
"AIR_TIME" : 355,
"DISTANCE" : 2475,
"CARRIER_DELAY" : "",
"WEATHER_DELAY" : "",
"NAS_DELAY" : "",
"SECURITY_DELAY" : "",
"LATE_AIRCRAFT_DELAY" : "",
我想通过执行此代码查询离开LAX的所有航班,但速度非常慢。
app.get('/getflights', (req, res) => {
if(err) console.log(err);
console.log("Loading data from flights...");
db.collection('flightdata')
.find({ORIGIN:/^JFK/})
.toArray((err, result) => {
if(err) throw err;
res.json(result);
});
我的问题是:如何优化此查询?在MongoDB文档中看了很多,但不能理解我应该如何做到这一点。
修改 添加限制并在评论后跳过,确保它更快,但它只获取1000行,我需要所有数据。
db.collection('flightdata').find({ORIGIN:"LAX"}).limit(1000).skip(1000).toArray((err, result) => {
if(err) throw err;
console.log("Fetch");
res.json(result);
});
修改 当运行db.flightdata({ORIGIN:" LAX"})。在终端中解释()我得到:
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "58b61138d383ad325b7e8892_infovis.flightdata",
"indexFilterSet" : false,
"parsedQuery" : {
"ORIGIN" : {
"$eq" : "LAX"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"ORIGIN" : 1
},
"indexName" : "_origin",
"isMultiKey" : false,
"multiKeyPaths" : {
"ORIGIN" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"ORIGIN" : [
"[\"LAX\", \"LAX\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "mtm-0-0-shard-00-00-yf1oj.mongodb.net",
"port" : 27000,
"version" : "3.4.2",
"gitVersion" : "3f76e40c105fc223b3e5aac3e20dcd026b83b38b"
},
"ok" : 1