Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对MongoDB数据库建模以高效地显示给定数组字段的一组值_Mongodb - Fatal编程技术网

如何对MongoDB数据库建模以高效地显示给定数组字段的一组值

如何对MongoDB数据库建模以高效地显示给定数组字段的一组值,mongodb,Mongodb,让我们假设我们想要为存储书籍数据的应用程序设计MongoDB数据库 每本书可以有许多标签: Book = { title, // String description, // String tags: [] // Array of String } 我想要一个页面,在其中我可以列出所有的标签(可能成千上万的标签),并有它的分页 每当用户想要查看此页面时,运行查询来聚合所有书籍的所有标记集并消除重复项是低效的 如何设计数据库,使上述场景高效且响应迅速

让我们假设我们想要为存储书籍数据的应用程序设计MongoDB数据库

每本书可以有许多标签:

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
数组查找所有书籍。

如果用户说他/她不想要主题集合,我相信他/她是指没有像您建议的那样使用不同的引用集合来存储标签。您能提供更多详细信息吗?