gpt4 book ai didi

node.js - MongoDB 中按日期分组

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:08 25 4
gpt4 key购买 nike

我正在 AppFog(前 Nodester)上运行博客风格的 Web 应用程序。它是用 NodeJS + Express 编写的,并使用 Mongoose 框架来持久化到 MongoDB。

MongoDB 是 1.8 版本,不知道 AppFog 是否会升级到 2.2。

为什么要介绍这个?好吧,现在我的“帖子”显示在基本的“分页”可视化中,我的意思是它们只是从 mongo 中获取,按日期降序排序,一次一页。这是一个片段:

Post
.find({pubblicato:true})
.populate("commenti")
.sort("-dataInserimento")
.skip(offset)
.limit(archivePageSize)
.exec(function(err,docs) {
var result = {};
result.postsArray = (!err) ? docs : [];
result.currentPage = currentPage;
result.pages = howManyPages;
cb(null, result);
});

现在,我的目标是按“dataInserimento”分组并显示“日记”之类的帖子,我的意思是:

第 1 页 => 2012/10/08:我显示 3 篇帖子

第2页=> 2012/10/10:我显示了2个帖子(2012/10/09没有帖子,所以我不允许出现白页)

第 3 页 => 2012/10/11:35 个帖子等...

我的想法是首先获取所有日期的分组列表(也许可以计算每天的帖子数),然后构建页面链接,当访问页面(日期)时,像上面一样进行查询,添加日期作为参数。

解决方案:

  • 聚合框架非常适合此目的,但我现在无法使用该版本的 Mongo

  • 以某种方式使用 .group(),但它在分片环境中不起作用的想法并不让我兴奋! :-(

  • 编写 MAP-REDUCE!我认为这是正确的方法,但我无法想象应该如何编写map()和reduce()。

你能帮我举个小例子吗?

谢谢

编辑:

peshkira的答案是正确的,但是,我不知道我是否需要这个。

我的意思是,我将拥有/archive/2012/10/01、/archive/2012/09/20 等 URL。

在每个页面中,有查询帖子的日期就足够了。但随后我必须显示“下一个”或“上一个”链接,因此我需要知道下一天或前一天包含哪些帖子(如果有)。也许我可以只查询日期大于或小于当前日期的帖子,并获取第一个日期?

最佳答案

假设您有类似的内容:

{
"author" : "john doe",
"title" : "Post 1",
"article" : "test",
"created" : ISODate("2012-02-17T00:00:00Z")
}
{
"author" : "john doe",
"title" : "Post 2",
"article" : "foo",
"created" : ISODate("2012-02-17T00:00:00Z")
}
{
"author" : "john doe",
"title" : "Post 3",
"article" : "bar",
"created" : ISODate("2012-02-18T00:00:00Z")
}
{
"author" : "john doe",
"title" : "Post 4",
"article" : "foo bar",
"created" : ISODate("2012-02-20T00:00:00Z")
}
{
"author" : "john doe",
"title" : "Post 5",
"article" : "lol cat",
"created" : ISODate("2012-02-20T00:00:00Z")
}

然后您可以按如下方式使用MapReduce:

map

它只是发出日期作为键和帖子标题。您可以将标题更改为 _id,这可能对您更有用。如果您存储日期的时间,您将只想使用日期(没有时间)作为键,否则 mongo 将按日期时间分组,而不仅仅是日期。在我的测试用例中,所有帖子的时间都相同 00:00:00,所以这并不重要。

function map() {
emit(this.created, this.title);
}

减少

它什么也不做,只是将一个键的所有值推送到一个数组,然后将该数组包装在一个结果对象中,因为 mongo 不允许数组作为reduce 函数的结果。

function reduce(key, values) {
var array = [];
var res = {posts:array};
values.forEach(function (v) {res.posts.push(v);});
return res;
}

执行

使用db.runCommand({mapreduce: "posts",map:map,reduce:reduce,out:{inline:1}})将输出以下结果:

{
"results" : [
{
"_id" : ISODate("2012-02-17T00:00:00Z"),
"value" : {
"posts" : [
"Post 2",
"Post 1"
]
}
},
{
"_id" : ISODate("2012-02-18T00:00:00Z"),
"value" : "Post 3"
},
{
"_id" : ISODate("2012-02-20T00:00:00Z"),
"value" : {
"posts" : [
"Post 5",
"Post 4"
]
}
}
],
...
}

希望这有帮助

关于node.js - MongoDB 中按日期分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12814503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com