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

MeteorJS+;MongoDB:当用户可以拥有相同的文档时,我应该如何设置集合?,mongodb,meteor,Mongodb,Meteor,我不太确定如何用一行字来表达我的问题,但这里有一个更深入的描述 我正在开发一个Meteor应用程序,用户可以“拥有”同一个文档。例如,一个用户有一个他们拥有的电影列表,当然多个人可以拥有同一部电影。为此,我考虑了几种构建数据库/集合的方法,但我不确定哪种方法最好 我还应该注意,电影信息来自一个外部API,当人们在我的应用程序中找到它们时,我正在将其存储到我自己的数据库中,以加快下一次查找 选项1(我的当前配置): 存储所有电影及其信息的集合(电影)。另一个集合,基本上基于userId在每个文档中

我不太确定如何用一行字来表达我的问题,但这里有一个更深入的描述

我正在开发一个Meteor应用程序,用户可以“拥有”同一个文档。例如,一个用户有一个他们拥有的电影列表,当然多个人可以拥有同一部电影。为此,我考虑了几种构建数据库/集合的方法,但我不确定哪种方法最好

我还应该注意,电影信息来自一个外部API,当人们在我的应用程序中找到它们时,我正在将其存储到我自己的数据库中,以加快下一次查找

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

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

备选案文3:
拥有该电影的每部电影上都有一个用户ID数组的电影集合。这听起来也很不错,但当我用新信息更新电影时,是否可以进行升级并保证用户ID的安全?

选项3似乎很合理。有些选择可能取决于每个收藏的规模或链接的数量(许多用户是否拥有同一部电影,用户是否拥有许多电影)

使用选项3的一些有用代码片段: 向上插入电影详细信息(如果已存在,则不会影响文档上的任何其他字段):

设置用户拥有电影(也不会影响任何其他文档字段。
$addToSet
如果该值已在数组中,则不会添加两次,而使用
$push
会创建重复项):

设置用户不再拥有电影:

Movies.update({_id: ~~some movie id~~}, {$pull: {userIds: ~~some user id~~}});
查找用户拥有的所有电影(mongo自动搜索字段的数组值):

查找用户拥有的所有电影,但将“用户”字段从结果中排除(如果movie.userIds是一个大数组,请将文档保持较小,或者保护其他用户电影所有权的隐私):


这是一个典型的面向对象数据库问题。Mongo在感谢链接上谈到了这一点。因此,如果我理解正确,最好的方法是使用类似于
{u id:“123”,title:“Movie title”…,user\u id:[“1”,“2”,“3”]}
?感谢这些代码片段,它们真的帮助我了解了它。这听起来确实是个不错的选择。我的问题是,无论哪种方式,我都将拥有一个可变的、未绑定的数组(电影中的userid数组,或者用户中的电影id数组)。我不确定哪个会更大;这取决于我拥有的用户数量(因为我没有发布atm机,所以没有)。虽然,最后一个片段似乎比在用户上循环一系列电影ID并查找每一部电影更有效。我想事实是,100万人可以轻松拥有同一部电影,但没有人拥有100万部电影。因此,也许另一种方法就是这样做(仍然取决于您正在构建的具体内容)。如果你用另一种方式做,你会想要像
var user=Users.findOne({{u id:~~some user~})
Movies.find({u id:{$in:user.movieIds}})我可以用全套的snippits更新答案。谢谢Mark,所以我最终还是保留了我的答案,但改进了我的Mongo查询,这正是我最初做错的地方。我认为这样做是有意义的,因为每个用户都有多个电影列表(包括自定义列表),一部电影可以在多个列表上。到目前为止,它运行得很好。谢谢你跟我说出来
Movies.update({_id: ~~some movie id~~}, {$addToSet: {userIds: ~~some user id~~}});
Movies.update({_id: ~~some movie id~~}, {$pull: {userIds: ~~some user id~~}});
Movies.find({userIds: ~~some user id~~});
Movies.find({userIds: ~~some user id~~}, {userIds: 0});