2017-06-14 16 views
0

我有超过2000万的记录,像这样的集合:增加MongoDB的性能比较与排序

{ 
    "_id" : ObjectId("58f8af0f65fc0a38e40a478f"), 
    "text" : "Example text", 
    "postdate" : NumberLong("1492692751921"), 
    "cId" : "58e3cdbe29c8a54394c52c74", 
} 

和索引这样的:{postdate : -1}

当然会有更多的领域,但是这是最重要。现在我想要这样查询:

db.coll.aggregate([ 
    { "$match" : { 
    "$and" : [ 
     { "postdate" : { "$gt" : 0}} , 
     { "postdate" : { "$lt" : 1497469601983}} , 
     { "cId" : "58e3cdbe29c8a54394c52c74"} 
    ] 
    }}, 
    { "$sort" : { "postdate" : -1}}, 
    { "$limit" : 20}]); 

但这需要很长时间。我想知道我是否可以提高这个表现。我需要这个查询来更快地工作。我能做什么?

谢谢

+0

为什么你在这里使用聚集,在这之后有什么你想要做的吗?把一个索引放在''postdate''上,但也可以用一个普通的查询来测试。同样假设你的''postdate''字段代表了自纪元以来的毫秒数,那么它也不可能有低于0的值,所以应该暗示下边界。 '.find({“postdate”:{“$ lt”:1497469601983},“cId”:“58e3cdbe29c8a54394c52c74”})。sort({“postdate”:-1})。limit(1)'。最重要的是,在你不需要的地方停止使用'$和'。除非另有明确说明,否则所有MongoDB查询表达式都已经**和argumemts。 –

+0

嗨用户6586661;如果你有性能问题,那么你的第一步应该是使用[解释函数](https://docs.mongodb.com/manual/reference/explain-results/)来查看服务器用于查询的查询计划,每个查询阶段需要多长时间。这将帮助您确定它在哪里缓慢运行,并通知您可能进行的更改。 –

回答

2

尝试创建索引:

{ "cId" : 1, "postdate" : 1 } 

该指数将索引包含在$比赛阶段,同时为索引排序结果这两个字段。有关索引分类的更多信息可参见here

您可能还想通过运行一些解释计划来检查性能。 The response to this question包含有关如何执行聚合解释的指南。

+0

谢谢,cId上的索引工作。但是我在postdate上使用了索引-1。 – user6586661