MeteorJS + MongoDB:当用户拥有相同的文档时,我应该如何设置我的集合?

时间:2014-11-03 22:44:53

标签: mongodb meteor

我不太确定如何在一行中提出我的问题,但这里有更深入的描述。

我正在构建一个Meteor应用程序,用户可以在其中拥有"同一份文件。例如,用户拥有他们拥有的电影列表,当然多个人可以拥有相同的电影。我有几种方法可以为此构建数据库/集合,但我不确定哪种方法最好。

我还应该注意,电影信息来自外部API,当我在我的应用中找到它们时,我目前存储在我自己的数据库中,以加快下一次查找。

选项1(我当前的配置): 一个集合(电影),存储所有电影及其信息。另一个集合,基本上基于userId存储每个文档中的电影ID列表。在启动时,我获取id列表,在我的数据库中查找电影,并将它们存储在本地集合中(其中有3个)。我从中看到的好处是我只需要存储一次电影。我到目前为止遇到的缺点是难以保持同步并在启动时正确加载(等待本地集合填充)。

选项2: 一个Movies集合,用于存储每个用户的电影对象列表。这使得初始查找和更新非常简单,但这意味着我将多次存储相同的大型文档。

选项3: 一个电影集合,在每部拥有该电影的电影上都有一系列用户标识。这听起来也不错,但是当我使用新信息更新电影时,upsert是否会起作用并保持用户安全?

1 个答案:

答案 0 :(得分:1)

选项3似乎合情合理。一些选择可能取决于每个集合的规模或链接的数量(许多用户拥有相同的电影,用户将拥有许多电影)。

使用选项3的一些有用的代码snippits:

插入影片详细信息(如果文档已存在,则不会影响文档上的任何其他字段):

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});