我有两个集合:(带有mongoose的架构)
在我的应用中,可以存在视频,某些视频可以成为活动的一部分。
关键是我想获得特定事件的所有视频,其中可见性(event.videos.visibility
)为真,视频状态为例如1,它应该被分类,例如video.date_created
和limit
/ skip
如何更改收藏模式以获得最佳效果?
在事件(冗余信息)中保存重要字段(例如date_created
,state
)是否也是个好主意?
或者实际架构是一个很好的解决方案吗?
实际解决方案有2个查询选项:
第一: 获取videos_visible - 来自事件的数组和搜索视频,其中id在此数组中且视频中的events-Array匹配($ elemMatch)event_id + visibility === true
第二:没有事件阵列的第一个解决方案
在这两种情况下,我都可以对视频进行排序并跳过/限制它们没有问题。 但我不知道这是不是一个好的解决方案。
我尝试的另一个解决方案是在event.videos_visible中保留其他事件/视频信息,例如visibility或display_type,而不是视频本身。 问题是,我无法对视频进行排序,或限制/跳过它们。 对于猫鼬群,不可能跳过/限制依赖于例如视频数据的视频数据。 video.date_created。在我看来,这不是处理这个查询/问题的正确方法。
我认为问题在于为这个“多对多”案例建立正确的架构。
答案 0 :(得分:0)
首先,它取决于活动的视频数量。
你应该问自己的问题是,什么是基数?事件与视频的关系是一对多还是一对少。
如果是一对一,那么嵌入视频部分(如visibility和created_date)没有问题,因为它不会影响整个文档的大小。这里的一个加分点是,您可以比没有嵌入视频并仅通过视频的_id字段引用视频更快地查询数据。
但是如果你想更新视频,那么:
但如果它是一对多关系,则始终建议在事件集合中使用_id引用。使用它的好处是:
然后查询将耗费大量时间。
我建议您在做出选择之前阅读此博客文章。
http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1