2017-10-14 58 views
0

我們有一個包含大量文檔的數據庫,隨着時間的推移它會變得越來越大。目前,查詢時間不是問題,因爲數據只有大約1年左右的時間。但是越大,查詢所需的時間越長,如果我們查詢所有內容。在MongoDB的一段時間內搜索一定數量的文檔

我們的想法是獲取每個第n個文檔,那裏有更多的文檔,您留下一些數據,但您仍然可以從數據中獲得一個良好的圖像。然而,這在Mongo中很難做到,似乎根本不起作用,因爲它仍然遍歷所有文檔。

有沒有辦法設置一個固定的查詢時間,不管有多少文檔,或者至少減少它?只要我們從各個時間範圍獲取文檔,我們是否會丟失整體數據並不重要。

+0

你們是否在你查詢的字段上使用索引? –

+0

是的,我們做@AlexP。 – nn3112337

+0

您可以使用聚合框架每月彙總數據。所以如果你想查詢完整的時間範圍,你的數據是預先聚合的,你不會失去任何東西。 –

回答

1

我不確切知道你的數據是怎麼樣的,但這裏是我的意思。我們假設這是您的數據存儲在數據庫中。

/* 1 */ 
{ 
    "_id" : ObjectId("59e272e74d8a2fe38b86187d"), 
    "name" : "data1", 
    "date" : ISODate("2017-11-07T00:00:00.000Z"), 
    "number" : 15 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("59e272e74d8a2fe38b86187f"), 
    "name" : "data2", 
    "date" : ISODate("2017-11-06T00:00:00.000Z"), 
    "number" : 19 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("59e272e74d8a2fe38b861881"), 
    "name" : "data3", 
    "date" : ISODate("2017-10-06T00:00:00.000Z"), 
    "number" : 20 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("59e272e74d8a2fe38b861883"), 
    "name" : "data4", 
    "date" : ISODate("2017-10-05T00:00:00.000Z"), 
    "number" : 65 
} 

我知道你想在一個月甚至幾年內比較一些數值。所以,你可以做以下

db.getCollection('test').aggregate([ 
{ 
    $match: { 
     // query on the fields with index 
     date: {$gte: ISODate("2017-10-05 00:00:00.000Z"), 
       $lte: ISODate("2017-11-07 00:00:00.000Z")} 
    } 
}, 
{ 
    // retrieve the month from each document 
    $project: { 
     _id: 1, 
     name: 1, 
     date: 1, 
     number: 1, 
     month: {$month: "$date"} 
    } 
}, 
{ 
    // group them by month and perform some accumulator operation 
    $group: { 
     _id: "$month", 
     name: {$addToSet: "$name"}, 
     dateFrom: {$min: "$date"}, 
     dateTo: {$max: "$date"}, 
     number: {$sum: "$number"} 
    } 
} 
]) 

我建議你保存前彙總數據,通過這種方式,而不是通過每月30份文件,例如你只需要搜索每月1次搜索。如果你有預先彙總的結果存儲,那麼你只需要彙總完整的數據一次,那麼你只需要運行新的數據進入前聚合。

這可能是東西你在找什麼?

此外,如果你有索引,他們的字段,你查詢有索引,那麼這也有幫助。否則,MongoDB必須掃描集合中的每個文檔。

相關問題