【发布时间】:2014-06-13 12:16:11
【问题描述】:
我在 mongoDB 中有以下示例文档。
{
"location" : {
"language" : null,
"country" : "null",
"city" : "null",
"state" : null,
"continent" : "null",
"latitude" : "null",
"longitude" : "null"
},
"request" : [
{
"referrer" : "direct",
"url" : "http://www.google.com/"
"title" : "index page"
"currentVisit" : "1401282897"
"visitedTime" : "1401282905"
},
{
"referrer" : "direct",
"url" : "http://www.stackoverflow.com/",
"title" : "index page"
"currentVisit" : "1401282900"
"visitedTime" : "1401282905"
},
......
]
"uuid" : "109eeee0-e66a-11e3"
}
注意:
- 数据库包含多个
10845文档 - 每个文档都包含近乎
100的请求(请求数组中有100个对象)。 技术/语言 -
node.js-
我让
setProfiling检查执行时间First Query - 13899ms Second Query - 9024ms Third Query - 8310ms Fourth Query - 6858ms 使用索引没有太大区别
查询:
我要执行以下aggregation queries 来获取数据。
var match = {"request.currentVisit":{$gte:core.getTime()[1].toString(),$lte:core.getTime()[0].toString()}};
For Example: var match = {"request.currentVisit":{$gte:"1401282905",$lte:"1401282935"}};
对于第三和第四个查询 request.visitedTime 而不是 request.currentVisit
-
第一
[ { "$project":{ "request.currentVisit":1, "request.url":1 }}, { "$match":{ "request.1": {$exists:true} }}, { "$unwind": "$request" }, { "$match": match }, { "$group": { "_id": { "url":"$request.url" }, "count": { "$sum": 1 } }}, { "$sort":{ "count": -1 } } ] -
第二个
[ { "$project": { "request.currentVisit":1, "request.url":1 }}, { "$match": { "request":{ "$size": 1 } }}, { "$unwind": "$request" }, { "$match": match }, { "$group": { "_id":{ "url":"$request.url" }, "count":{ "$sum": 1 } }}, { "$sort": { "count": -1} } ] -
第三
[ { "$project": { "request.visitedTime":1, "uuid":1 }}, { "$match":{ "request.1": { "$exists": true } }}, { "$match": match }, { "$group": { "_id": "$uuid", "count":{ "$sum": 1 } }}, { "$group": { "_id": null, "total": { "$sum":"$count" }} }} ] -
第四
[ { "$project": { "request.visitedTime":1, "uuid":1 }}, { "$match":{ "request":{ "$size": 1 } }}, { "$match": match }, { "$group": { "_id":"$uuid", "count":{ "$sum": 1 } }}, { "$group": { "_id":null, "total": { "$sum": "$count" } }} ]
问题:
获取数据的时间超过了38091 ms。
有什么办法可以优化查询吗?
任何建议将不胜感激。
【问题讨论】:
-
您是否尝试在
request子文档上创建索引?确定它是否适用于您的应用程序。 -
你能给我们解释一下吗?
-
我其实只是想知道
match变量的秘密究竟是什么。这些查询中存在明显的问题,这些问题很容易回答,但在不了解细节的情况下并不完整。 -
@NeilLunn 我添加了匹配过滤器
-
我在问
match管道阶段内的match变量内的条件是什么。这样我们就知道你的实际情况是什么。它没有在你上面的代码中列出
标签: mongodb mongodb-query aggregation-framework