mongodb mongoose有许多额外的属性

时间:2016-02-16 15:21:56

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

我有两个集合:(带有mongoose的架构)

Collection Schemas

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

如何更改收藏模式以获得最佳效果?

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

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

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

第一: 获取videos_visible - 来自事件的数组和搜索视频,其中id在此数组中且视频中的events-Array匹配($ elemMatch)event_id + visibility === true

第二:没有事件阵列的第一个解决方案

在这两种情况下,我都可以对视频进行排序并跳过/限制它们没有问题。 但我不知道这是不是一个好的解决方案。

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

我认为问题在于为这个“多对多”案例建立正确的架构。

1 个答案:

答案 0 :(得分:0)

首先,它取决于活动的视频数量。

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

如果是一对一,那么嵌入视频部分(如visibility和created_date)没有问题,因为它不会影响整个文档的大小。这里的一个加分点是,您可以比没有嵌入视频并仅通过视频的_id字段引用视频更快地查询数据。

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

  1. 只输入嵌入的视频文档中那些不会改变的字段。
  2. 如果您包含将来可能会更改的字段,那么在视频集中编辑视频时,您还必须在事件集合中的每个事件中对其进行编辑,其中该视频作为子文档存在。
  3. 但如果它是一对多关系,则始终建议在事件集合中使用_id引用。使用它的好处是:

    1. 确保您的文档始终保持低于16MB。
    2. 如果您需要更新视频,那么您只需在视频集中进行一次。
    3. 然后查询将耗费大量时间。

      我建议您在做出选择之前阅读此博客文章。

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