在MongoDB的一段时间内搜索一定数量的文档
问题描述:
我们有一个包含大量文档的数据库,随着时间的推移它会变得越来越大。目前,查询时间不是问题,因为数据只有大约1年左右的时间。但是越大,查询所需的时间越长,如果我们查询所有内容。在MongoDB的一段时间内搜索一定数量的文档
我们的想法是获取每个第n个文档,那里有更多的文档,您留下一些数据,但您仍然可以从数据中获得一个良好的图像。然而,这在Mongo中很难做到,似乎根本不起作用,因为它仍然遍历所有文档。
有没有办法设置一个固定的查询时间,不管有多少文档,或者至少减少它?只要我们从各个时间范围获取文档,我们是否会丢失整体数据并不重要。
答
我不确切知道你的数据是怎么样的,但这里是我的意思。我们假设这是您的数据存储在数据库中。
/* 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必须扫描集合中的每个文档。
你们是否在你查询的字段上使用索引? –
是的,我们做@AlexP。 – nn3112337
您可以使用聚合框架每月汇总数据。所以如果你想查询完整的时间范围,你的数据是预先聚合的,你不会失去任何东西。 –