我不太确定如何在一行中提出我的问题,但这里有更深入的描述。
我正在构建一个Meteor应用程序,用户可以在其中拥有"同一份文件。例如,用户拥有他们拥有的电影列表,当然多个人可以拥有相同的电影。我有几种方法可以为此构建数据库/集合,但我不确定哪种方法最好。
我还应该注意,电影信息来自外部API,当我在我的应用中找到它们时,我目前存储在我自己的数据库中,以加快下一次查找。
选项1(我当前的配置): 一个集合(电影),存储所有电影及其信息。另一个集合,基本上基于userId存储每个文档中的电影ID列表。在启动时,我获取id列表,在我的数据库中查找电影,并将它们存储在本地集合中(其中有3个)。我从中看到的好处是我只需要存储一次电影。我到目前为止遇到的缺点是难以保持同步并在启动时正确加载(等待本地集合填充)。
选项2: 一个Movies集合,用于存储每个用户的电影对象列表。这使得初始查找和更新非常简单,但这意味着我将多次存储相同的大型文档。
选项3: 一个电影集合,在每部拥有该电影的电影上都有一系列用户标识。这听起来也不错,但是当我使用新信息更新电影时,upsert是否会起作用并保持用户安全?
答案 0 :(得分:1)
选项3似乎合情合理。一些选择可能取决于每个集合的规模或链接的数量(许多用户拥有相同的电影,用户将拥有许多电影)。
插入影片详细信息(如果文档已存在,则不会影响文档上的任何其他字段):
Movies.upsert({name: "Jaws"}, {$set: {year: 1975}});
设置用户拥有电影(也不会影响任何其他文档字段。$addToSet
如果已使用$push
而不是数组,则不会将值添加两次而是会创建重复项:
Movies.update({_id: ~~some movie id~~}, {$addToSet: {userIds: ~~some user id~~}});
设置用户不再拥有电影:
Movies.update({_id: ~~some movie id~~}, {$pull: {userIds: ~~some user id~~}});
查找用户拥有的所有电影(mongo自动搜索字段的数组值):
Movies.find({userIds: ~~some user id~~});
查找用户拥有的所有电影,但从结果中排除用户字段(如果movie.userIds是大型数组或保护其他用户电影所有权的隐私,则保持文档较小):
Movies.find({userIds: ~~some user id~~}, {userIds: 0});