【问题标题】:Search a fixed amount of documents over a period of time in MongoDB在MongoDB中搜索一段时间内固定数量的文档
【发布时间】:2017-10-14 20:09:15
【问题描述】:

我们有一个包含大量文档的数据库,随着时间的推移会变得越来越大。现在,查询时间不是问题,因为数据只有大约 1 年的历史。但是这个越大,如果我们查询所有内容,查询时间就会越长。

我们的想法是获取每第 n 个文档,文档越多,您就会遗漏一些数据,但随着时间的推移,您仍然可以从数据中获得良好的图像。但是,这在 Mongo 中很难做到,而且似乎根本不起作用,因为它仍然遍历所有文档。

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

【问题讨论】:

  • 你们在查询的字段上使用索引吗?
  • 是的,我们做@AlexP。
  • 您可以使用聚合框架每月聚合您的数据。因此,如果您想查询完整的时间范围,您的数据是预先汇总的,您不会丢失任何内容。
  • 您的意思是,每月汇总所有文档,然后查询?聚合是否比对每个文档的查询快得多?抱歉,我对 mongo 还是很陌生

标签: database mongodb query-optimization


【解决方案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 必须扫描集合中的每个文档。

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 2017-07-11
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多