Node.js 我应该在MongoDB中使用大量集合来帮助构建数据结构吗?

Node.js 我应该在MongoDB中使用大量集合来帮助构建数据结构吗?,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,我正在使用NodeJS和MongoDB制作一个服务器同步日志应用程序。我所有的超级关系数据都在MySQL中。但是对于用户的每日回忆录,我将使用Mongo,因为正如您可能已经意识到的那样,每天都会有大量的笔记/日记,我想学习MongoDB,而且对于很多非关系数据来说,它应该更好 我已经学会了如何创建DBs和做任何事情,但是所有教程都没有涉及到的事情是最重要的,我如何构造数据 下面我举了几个例子来说明我的想法,由于我对Mongo还没有太多经验,我想听听一些建议,哪种选择是最好的性能选择 提前感谢您的

我正在使用NodeJS和MongoDB制作一个服务器同步日志应用程序。我所有的超级关系数据都在MySQL中。但是对于用户的每日回忆录,我将使用Mongo,因为正如您可能已经意识到的那样,每天都会有大量的笔记/日记,我想学习MongoDB,而且对于很多非关系数据来说,它应该更好

我已经学会了如何创建DBs和做任何事情,但是所有教程都没有涉及到的事情是最重要的,我如何构造数据

下面我举了几个例子来说明我的想法,由于我对Mongo还没有太多经验,我想听听一些建议,哪种选择是最好的性能选择

提前感谢您的时间和任何帮助

示例1:我的数据库有一个名为“Days”的大型集合,该集合的每个条目如下所示:(对不起,不管我怎么想,这听起来像是性能最低的选项,正如我所说,我在Mongo方面没有经验,可能是错的。)

例2:我的数据库中有一个以用户ID命名的每个用户的集合(对我来说,这听起来很好,而且很有条理,根据我的常识,这听起来像是性能最好的一个,但从我谷歌搜索的结果来看,人们说这不好,这正是我在这里提问的原因),该集合的每个条目如下所示:

{
day: 12,

month: 5,

year: 2018,

dayTitle: “Lame day at home..”,

dayDescription: “Installed arch..”,

hugeLoadOfIndividualSmallNotesForThisDayWithTimeStamps: [

    { data: “Woke up, start now”, time: “9:44”,

    { data: “Finally figured out what fdisk is”, time: “21:29” } } …

]
}
{
userID: 902,

dayTitle: “Lame day at home..”,

dayDescription: “Installed arch..”,

hugeLoadOfIndividualSmallNotesForThisDayWithTimeStamps: [

    { data: “Woke up, start now”, time: “9:44”,

    { data: “Finally figured out what fdisk is”, time: “21:29” } } …

]
}
例3:我的数据库每天都有一个集合。(这与示例2基本相同,但集合会减少。我不确定这是否会比选项2的性能更好,而且这会有点难以实现,因为天数会发生变化等),该集合的每个条目如下所示:

{
day: 12,

month: 5,

year: 2018,

dayTitle: “Lame day at home..”,

dayDescription: “Installed arch..”,

hugeLoadOfIndividualSmallNotesForThisDayWithTimeStamps: [

    { data: “Woke up, start now”, time: “9:44”,

    { data: “Finally figured out what fdisk is”, time: “21:29” } } …

]
}
{
userID: 902,

dayTitle: “Lame day at home..”,

dayDescription: “Installed arch..”,

hugeLoadOfIndividualSmallNotesForThisDayWithTimeStamps: [

    { data: “Woke up, start now”, time: “9:44”,

    { data: “Finally figured out what fdisk is”, time: “21:29” } } …

]
}

如前所述,提前感谢各位

对于您的案例,最好将所有内容都放在一个集合中。您建议的所有其他分解数据的方法看起来都可以通过在用户id和日期字段上建立索引来很好地实现

我倾向于使用集合将同一项目中的数据集组合在一起,但这些数据集具有不同的数据结构

如果您将天数或用户分成不同的集合,那么这将如何扩展?如果你想查询所有日期的所有文本,如果你的应用已经使用了十年,你想连接到几千个不同的集合吗?尝试为不同的用户体验编写一些测试用例,看看编写查询以获取数据是多么容易


TLDR:可能最好是将内容集中在一个集合中,并使用索引进行分类。

我建议对所有回忆录进行类似于关系和一个集合的操作。如果它变得如此之大,您可以使用分片,您是否看到
hugeLoadOfIndividualSmallNotesForThisDayWithTimeStamps
增长(基本上)而没有绑定?如果是这样,则用户数据和notes数据应该位于单独的集合中,可以通过
$lookup
进行合并。如果小便笺的数量是静态的,那么将其作为数组拉入用户集合是有价值的。