我正在创建一个Node + MongoDB应用程序,用户可以将书籍保存到他们的“库”中。当前工作版本只有一个用户集合,如下所示:
users:[
{
_id: ...,
name: “Name”,
… other info,
library: [
{
bookName: “In Cold Blood”,
author: “Truman Capote”
ISBN: 123783742
_id: ...
}
]
},
... other users]
这在功能上符合我的需要。但从长远来看,我可能想要显示一些涉及所有用户的统计信息。例如,最受欢迎的书籍或最受欢迎的作者,或流派。
我想我必须为我要跟踪的每件事创建一个新的集合,然后每当用户保存一本书时,检查它的类型和作者等是否已经在数据库,如果没有创建它们,并保持一个单独的总喜欢那里?这是否是在noSQL数据库中处理此类事情的正确方法?有没有更好的方法?
由于
答案 0 :(得分:1)
你应该看看MongoDB的aggregation pipeline。您可以保留一组统计信息,但它们可能与您的实际数据不同步。
通过使用MongoDB的聚合管道,您可以轻松地汇总数据,以确定哪个是最受欢迎的书籍/作者/流派:
db.users.aggregate(
[
{ $unwind : "$library" },
{ $group : { _id : "$library.bookName" , number : { $sum : 1 } } },
{ $sort : { number : -1 } },
{ $limit : 5 }
]
)
如果可能,请尝试限制聚合的范围,以便它不需要在尽可能多的用户上进行聚合。您可以在$match
阶段之前使用$unwind
阶段执行此操作。