mongodb为旧条目花费了太多时间

时间:2017-10-21 10:47:08

标签: node.js mongoose

我是mongodb的新手,我正面临着一个问题,我在我的收藏中有大约数百万份文件,我试图使用findOne({})命令找到单个条目
当我试图找到最近的条目然后响应以毫秒为单位时但是当我试图获取大约6亿个文档的旧条目时,那么在mongo shell上需要大约2分钟,而我的节点服务器给出了

{ MongoErro : connection 1 to 127.0.0.1:27017 timed out }

我的nodejs服务器发送一个空响应。
任何人都可以告诉我该怎么做才能解决这个问题。提前致谢

解释给我了

    db.contacts.find({"phoneNumber":"9165900137"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "meanApp.contacts",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "phoneNumber" : {
                                "$eq" : "9165900137"
                        }
                },
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "phoneNumber" : {
                                        "$eq" : "9165900137"
                                }
                        },
                        "direction" : "forward"
                },
                "rejectedPlans" : [ ]
        },
        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 1,
                "executionTimeMillis" : 321188,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 495587806,
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                                "phoneNumber" : {
                                        "$eq" : "9165900137"
                                }
                        },
                        "nReturned" : 1,
                        "executionTimeMillisEstimate" : 295230,
                        "works" : 495587808,
                        "advanced" : 1,
                        "needTime" : 495587806,
                        "needYield" : 0,
                        "saveState" : 3871779,
                        "restoreState" : 3871779,
                        "isEOF" : 1,
                        "invalidates" : 0,
                        "direction" : "forward",
                        "docsExamined" : 495587806
                }
        },
        "serverInfo" : {
                "host" : "li1025-15.members.linode.com",
                "port" : 27017,
                "version" : "3.2.16",
                "gitVersion" : "056bf45128114e44c5358c7a8776fb582363e094"
        },
        "ok" : 1
}

1 个答案:

答案 0 :(得分:0)

如解释计划结果中所示,当前查询正在进行收集扫描。这意味着它必须扫描集合中的每个文档以产生匹配,并且您有大约5亿个文档。

尝试添加此索引,可能需要一些时间来创建它。

  

db.contacts.createIndex({phoneNumber:1},{background:true})

索引创建成功后运行查询,您必须看到性能的显着提高。为了确定索引是否被提取,请再次尝试解释,它应该不再说COLLSCAN。