在MongoDB的一段时间内搜索一定数量的文档

问题描述:

我们有一个包含大量文档的数据库,随着时间的推移它会变得越来越大。目前,查询时间不是问题,因为数据只有大约1年左右的时间。但是越大,查询所需的时间越长,如果我们查询所有内容。在MongoDB的一段时间内搜索一定数量的文档

我们的想法是获取每个第n个文档,那里有更多的文档,您留下一些数据,但您仍然可以从数据中获得一个良好的图像。然而,这在Mongo中很难做到,似乎根本不起作用,因为它仍然遍历所有文档。

有没有办法设置一个固定的查询时间,不管有多少文档,或者至少减少它?只要我们从各个时间范围获取文档,我们是否会丢失整体数据并不重要。

+0

你们是否在你查询的字段上使用索引? –

+0

是的,我们做@AlexP。 – nn3112337

+0

您可以使用聚合框架每月汇总数据。所以如果你想查询完整的时间范围,你的数据是预先聚合的,你不会失去任何东西。 –

我不确切知道你的数据是怎么样的,但这里是我的意思。我们假设这是您的数据存储在数据库中。

/* 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必须扫描集合中的每个文档。