mongodb - meteor JS + MongoDB : How should I set up my collections when users can have the same document?

标签 mongodb meteor

我不太确定如何用一句话表达我的问题,但这里有更深入的描述。

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

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

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

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

选项 3: 一个 Movies 集合,其中包含拥有该电影的每部电影的用户 ID 数组。这听起来也不错,但是当我用新信息更新电影时,upsert 会起作用并确保用户 ID 安全吗?

最佳答案

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

使用选项 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});

关于mongodb - meteor JS + MongoDB : How should I set up my collections when users can have the same document?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724673/

相关文章:

java - 过滤 mongodb 查询后返回的数组元素

python - Linux Nagios 检查问题 : MongoDB check_mongodb. py

javascript - MongoDB 中插入失败

node.js - 使用 Meteor 从 Mongo 同步读取数据

javascript - mongodb - 在运算符中 - 忽略对象键顺序

javascript - 在 Node.js 应用程序中处理外部触发器

spring - 为什么 Spring ReactiveMongoRepository 没有 Mono 的保存方法?

mongodb - 更新 MongoDB 文档中的复杂对象

javascript - 回调返回未定义的meteor.call

javascript - Meteor 路由器在开发模式下工作,但在生产模式下不工作