【问题标题】:mongodb mongoose many to many with additional attributes带有附加属性的mongodb mongoose多对多
【发布时间】:2016-05-27 22:54:51
【问题描述】:

我有两个集合:(带有猫鼬的模式)

在我的应用中可以存在视频,并且某些视频可以是活动的一部分。 关键是我想获取特定事件的所有视频,其中可见性 (event.videos.visibility) 为真,视频状态为例如1,它应该被排序,例如video.date_createdlimit/skip

我必须如何更改集合架构才能获得最佳性能?

将视频中的重要字段(如date_createdstate)也保存在事件中(冗余信息)是否是个好主意?

或者实际的架构是一个好的解决方案?

实际解决方案有2个查询选项:

首先: 从事件中获取videos_visible - 数组并搜索视频,其中id 在此数组中,并且视频中的events-Array 匹配($elemMatch)event_id + visibility === true

第二种:第一个没有事件数组的解决方案

在这两种方法中,我都可以对视频进行排序并毫无问题地跳过/限制它们.. 但我不知道这是否是一个好的解决方案。

我尝试的另一个解决方案是在 event.videos_visible 中而不是在视频本身中保留其他事件/视频信息,例如可见性或 display_type。 问题是,我无法对视频进行排序,或限制/跳过它们。 对于 mongoose-population,无法跳过/限制视频数据,例如video.date_created。在我看来,这不是处理此查询/问题的正确方法。

我认为问题在于为这种“多对多”案例建模正确的模式。

【问题讨论】:

    标签: javascript node.js mongodb mongoose many-to-many


    【解决方案1】:

    首先,这取决于一个事件可以有多少视频。

    您应该问自己的问题是,基数是多少?事件与视频的关系是一对多还是一对多

    如果是一对多,那么嵌入视频的部分内容(例如可见性和 c​​reated_date)就没有问题,因为它不会对整个文档的大小产生太大影响。这里的一个优点是,与不嵌入视频并仅通过视频的 _id 字段引用视频相比,您将能够更快地查询数据。

    但如果你想更新视频,那么:

    1. 要么只输入嵌入式视频文档中那些不会更改的字段。
    2. 如果您包含将来可能更改的字段,那么除了在视频集合中编辑视频外,您还必须在该视频作为子文档存在的事件集合中的每个事件中对其进行编辑。

    但如果是一对多关系,则始终建议在事件集合中使用 _id 引用。使用它的优点是:

    1. 它将确保您的文档始终小于 16MB。
    2. 如果您必须更新视频,则只需在视频集合中更新一次。

    但是查询会非常耗时。

    我建议您在做出选择之前先阅读这篇博文。

    http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1

    【讨论】:

    • 好的,它是一对多的基数,所以在视频中保存额外的数据将是更好的解决方案。但是使用事件中的数组进行搜索还是不使用更好?例如,如果一个事件中有 700 个视频,我会执行类似“在数组和事件中查找 id 的流:{$elemMatch: { event_id: event_id, display_type:2}}”或“查找 {$elemMatch: { event_id: event_id, display_type:2}}" 所以没有数组。哪一个会更好? ps 感谢您的快速响应
    • 好的。因此,如果它是一对多的,只需确保多部分不会太大。因为如果是这样,那么您的事件文档的大小可能会增长并超过 16MB 的 MongoDB 文档大小。因此,请确保它不是 ONE TO SQUILLIONS(正如他们所说的那样)。此外,如果您将视频文档的某些部分嵌入到事件集合中,我认为您不必根据 EventID 从视频集合中查找视频。因为您的活动文档中已经有部分视频。因此,在您的架构的所有设计中,完全取决于您的应用程序的数据访问模式。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2014-08-15
    相关资源
    最近更新 更多