如何对MongoDB数据库建模以高效地显示给定数组字段的一组值
让我们假设我们想要为存储书籍数据的应用程序设计MongoDB数据库 每本书可以有许多标签:如何对MongoDB数据库建模以高效地显示给定数组字段的一组值,mongodb,Mongodb,让我们假设我们想要为存储书籍数据的应用程序设计MongoDB数据库 每本书可以有许多标签: Book = { title, // String description, // String tags: [] // Array of String } 我想要一个页面,在其中我可以列出所有的标签(可能成千上万的标签),并有它的分页 每当用户想要查看此页面时,运行查询来聚合所有书籍的所有标记集并消除重复项是低效的 如何设计数据库,使上述场景高效且响应迅速
Book = {
title, // String
description, // String
tags: [] // Array of String
}
我想要一个页面,在其中我可以列出所有的标签(可能成千上万的标签),并有它的分页
每当用户想要查看此页面时,运行查询来聚合所有书籍的所有标记集并消除重复项是低效的
如何设计数据库,使上述场景高效且响应迅速
注:理想情况下,我不希望有一个主题集合来解决这个问题。以下查询将为您提供所有排序的不同标记:
db.books.distinct("tags", {}).sort({tags : 1});
但是,为了提高效率,您需要为tags字段编制索引。这样,索引将用于获取和排序结果
db.books.ensureIndex({tags: 1});
正如您在docs()中所看到的,distinct操作将使用索引(如果可用),如果它像您的案例一样被涵盖,则更好 我认为,其中一个解决方案可能是这样的:
Book = {
title, // String
description, // String
tags: [] // Array of String (Tag names)
}
Tag = {
name // String
}
标签的名称
应该是唯一的,因此如果用户添加新书并向其中添加一些标签,您可以在标签集合中找到此标签,如果此标签存在,则将其名称
添加到图书文档中的标签
数组中,如果此标记不存在,则将其添加到标记集合中,并将其名称添加到图书文档中的标记数组中。当用户单击某个标记以查看所有相关书籍时,您应该在标记
数组中找到带有此标记的所有书籍。此外,您还可以使用\u id
字段作为标记名,并使用String代替ObjectId
另一个解决方案:
Book = {
title, // String
description // String
}
Tag = {
name, // String
books: [] // Array of books titles or ids
}
在这种情况下,当用户添加一些书籍和标签时,您应该在标签集合中找到此标签,如果不存在则创建它,然后将书籍\u id
添加到此标签文档中的书籍数组。当用户点击某个标签查看所有相关书籍时,您可以在标签文档中使用books
数组查找所有书籍。如果用户说他/她不想要主题集合,我相信他/她是指没有像您建议的那样使用不同的引用集合来存储标签。您能提供更多详细信息吗?