MongoDB与数据粒化

MongoDB与数据粒化,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我的数据库中充满了记录: {date: ISODate("2015-04-04T10:01Z"), sentence: "Lorem ipsum"} {date: ISODate("2015-04-04T20:31Z"), sentence: "dolor sit"} {date: ISODate("2016-05-04T03:55Z")} // No `sentence` here {date: ISODate("2017-01-04T09:10Z"), sentence: "amet,"}

我的数据库中充满了记录:

{date: ISODate("2015-04-04T10:01Z"), sentence: "Lorem ipsum"}
{date: ISODate("2015-04-04T20:31Z"), sentence: "dolor sit"}
{date: ISODate("2016-05-04T03:55Z")} // No `sentence` here
{date: ISODate("2017-01-04T09:10Z"), sentence: "amet,"}
{date: ISODate("2019-02-04T19:30Z"), sentence: "consectetur adipiscing"}
比如说,用户希望打印2015年至2018年间某个月出现的第一句话。显然,答案是:

{date: ISODate("2015-04-04T10:01Z"), sentence: "Lorem ipsum"}
{date: ISODate("2017-01-04T09:10Z"), sentence: "amet,"}
但是,如果我的数据库有数百万条记录,而且记录范围在很宽的年份跨度之间,那么这将是没有效率的。我可能需要一些聪明的算法来将这些数据粒化。第一个猜测是每N个月跳过一次结果(可能使用聚合框架?)。是否可以使用MongoDB驱动程序在单个查询中执行这样的操作

乍一看,这似乎是一个微不足道的颗粒化例子,但我在互联网上找不到任何例子

另外,我说的是几个月,但是如果我想在将来扩展请求,并按天、小时等添加分组,该怎么办

编辑:

对不起,我想我不够精确。事实上,我知道可以按年、月、日等进行分组,但我更感兴趣的是,我们如何构建巧妙的算法来细化这些数据:


请注意,粒化不是
$limit
,它更像是使用
$sample
操作符,而是使用均匀分布。

正如styvane在其评论中解释的,您可以通过聚合框架实现这一点。 您可以使用诸如
$year之类的运算符从
ISODate()
中提取小时等ect

要仅获取每个月的第一条记录,您可以按年/月对记录进行分组,并保留第一条语句,如下所示:

db.collection.aggregate([{
    "$match": {
        "sentence": {
            "$exists": true
        }
    }
}, {
    "$group": {
        "_id": {
            "year": {
                "$year": "$date"
            },
            "month": {
                "$month": "$date"
            }
        },
        "date": {
            "$first": "$date"
        },
        "sentence": {
            "$first": "$sentence"
        }
    }
}]) 

你可以在这里试试:

我想你想要的是
$group
通过和检索句子。如果您决定使用
$first
$last
则按日期按升序排列您的文档。在排序之前,您可能希望在不使用“句子”键的情况下使用运算符和
$match
过滤掉文档。@styvane,不完全是-请检查我编辑的问题。不过,谢谢@felix,我想我没有解释清楚我问题的重点是什么。我更想寻找粒化算法(MongoDB和数据粒化),而不是如何将结果分组为月、日等。请检查我编辑的问题。@joe.kovalski,然后您应该使用
$sample
。是什么让你觉得它没有均匀分布?如果还不够好,恐怕你得用自己的算法手动完成……你是mongoplayground.net的作者吗?当从linkSolution执行脚本时,我在配置或查询中发现了一些错误,这些脚本工作得非常好+1@joe.kovalski,我想工具可能有问题。您需要将模式切换到mgodatagen并返回到json。这对我来说很好:)
db.collection.aggregate([{
    "$match": {
        "sentence": {
            "$exists": true
        }
    }
}, {
    "$group": {
        "_id": {
            "year": {
                "$year": "$date"
            },
            "month": {
                "$month": "$date"
            }
        },
        "date": {
            "$first": "$date"
        },
        "sentence": {
            "$first": "$sentence"
        }
    }
}])