Mongodb 在单个查询中阅读类别和文章数

Mongodb 在单个查询中阅读类别和文章数,mongodb,mongoose,count,grouping,Mongodb,Mongoose,Count,Grouping,我在MongoDb中有一个数据库,其中包含两个集合:“类别”和“文章”。 我在NodeJs上使用Mongoose连接到数据库并读取类别。我想计算一个类别的文章数量,而不需要进行额外的请求/查询,因此如果我能在数据库级别解决这个问题,那将是完美的 “类别”集合中的项目如下所示: { '_id' : ObjectId("..."), 'feed_id' : 1, 'name': 'Blog posts' } { '_id' : ObjectId("..."), 'feed_id' : 1, 'ti

我在MongoDb中有一个数据库,其中包含两个集合:“类别”和“文章”。 我在NodeJs上使用Mongoose连接到数据库并读取类别。我想计算一个类别的文章数量,而不需要进行额外的请求/查询,因此如果我能在数据库级别解决这个问题,那将是完美的

“类别”集合中的项目如下所示:

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'name': 'Blog posts'
}
{
'_id' : ObjectId("..."),
'feed_id' : 1,
'title': 'Article title',
'published' : '12/09/2012',
...
}
“articles”集合中的项目如下所示:

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'name': 'Blog posts'
}
{
'_id' : ObjectId("..."),
'feed_id' : 1,
'title': 'Article title',
'published' : '12/09/2012',
...
}
因此,使用“feed_id”字段链接类别和文章

我想出口所有类别以及相应数量的物品:

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'name': 'Blog posts',
'no_articles': 4
}
我不确定我应该怎么做:

1) 在类别集合中创建“否文章”字段?如果是,我希望在插入文档或从文章集合中删除文档时自动更新此字段

2) 阅读分类时,将文章总结为“无文章”


我读了一些关于MapReduce和group的内容,但不太明白是否可以将它们用于此特定任务。

这是传统关系数据库真正发挥作用的用例之一

使用mongodb中的一个查询是不可能做到这一点的。你提到的“
no_articles
字段”就是一条出路。这种方法的通用名称(无论如何,在Rails人员中)是:
计数器缓存列
。我对猫鼬不是很熟悉,所以我不知道它是否会为你保留这个领域。MongoDB本身当然不会这么做。但是自己维护它并不是一件很麻烦的事,你只需要准确


我建议你在阅读分类时不要数数文章。这是一个典型的问题示例,计数器缓存列可以防止它。

这是传统关系数据库真正发挥作用的用例之一

使用mongodb中的一个查询是不可能做到这一点的。你提到的“
no_articles
字段”就是一条出路。这种方法的通用名称(无论如何,在Rails人员中)是:
计数器缓存列
。我对猫鼬不是很熟悉,所以我不知道它是否会为你保留这个领域。MongoDB本身当然不会这么做。但是自己维护它并不是一件很麻烦的事,你只需要准确


我建议你在阅读分类时不要数数文章。这是一个典型的问题示例,计数器缓存列可以防止它。

为什么不直接将类别存储在post文档中?由于您似乎正在为每个使用该类别的帖子创建新的类别文档(通过使用feed_id的一对多链接可以证明),因此在帖子文档中存储一个类别数组可能是有意义的

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'title': 'Article title',
'published' : '12/09/2012',
...
categories : [ 'Blog Posts', 'Category 2' ]
}
然后你可以做一个

db.articles.find({categories : 'Blog Posts' })
要查找具有特定类别的所有文章,您可以添加一个.count()来获取计数

使用这些feed_id加入对MongoDB来说是一种诅咒。你不能跨集合合并,所以你要么去规范化,要么把所有的东西都放在一个大集合中。Mongo的设计目的是让您可以对所有内容进行非规范化


如果这似乎不是解决问题的正确方法,那么您可能更适合使用RDBMS。

为什么不直接将类别存储在post文档中?由于您似乎正在为每个使用该类别的帖子创建新的类别文档(通过使用feed_id的一对多链接可以证明),因此在帖子文档中存储一个类别数组可能是有意义的

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'title': 'Article title',
'published' : '12/09/2012',
...
categories : [ 'Blog Posts', 'Category 2' ]
}
然后你可以做一个

db.articles.find({categories : 'Blog Posts' })
要查找具有特定类别的所有文章,您可以添加一个.count()来获取计数

使用这些feed_id加入对MongoDB来说是一种诅咒。你不能跨集合合并,所以你要么去规范化,要么把所有的东西都放在一个大集合中。Mongo的设计目的是让您可以对所有内容进行非规范化


如果这似乎不是解决问题的正确方法,那么您可能更适合使用RDBMS。

我认为计数器缓存列是Rails特有的,Mongoose似乎不支持它。在任何情况下,只要我更新“articles”集合,我都会按照您的建议修改“categories”集合中的“no_articles”字段。非常感谢您的帮助。我认为计数器缓存列是Rails特有的,它似乎不受Mongoose的支持。在任何情况下,只要我更新“articles”集合,我都会按照您的建议修改“categories”集合中的“no_articles”字段。非常感谢你的帮助。嗯,你是怎么推断出有一对一的关系的?我没有得到这个印象。在我看来,每个类别都有一个唯一的feed\u id,它与之相关。因此,尽管可能有10个“c++”类别,但我的印象是,每个应用了该类别的帖子都将创建一个新类别。在当前模式中,我看不到将一个类别与多个帖子相关联的方法。一个类别的feed_id=1和十篇文章的feed_id=1怎么样。可能的当然。是的,你是对的,我误解了。无论哪种方式,Mongo的使用都很糟糕,试图做一大堆这样的连接。如果我不够清楚,很抱歉。对于每个类别,我都有很多文章,因此关系实际上是1到n。同样,在我的例子中,一篇文章属于一个类别。我将这些类别存储在一个单独的集合中,这样我可以很容易地修改它们。嗯,你是如何推断出存在一对一的关系的?我没有得到这个印象。在我看来,每个类别都有一个唯一的feed\u id,它与之相关。因此,尽管可能有10个“c++”类别,但我的印象是,每个应用了该类别的帖子都将创建一个新类别。在当前模式中,我看不到将一个类别与多个帖子相关联的方法。一个feed_id=1的类别如何