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"
}
}
}])