【问题标题】:MeteorJS collection vs. arrayMeteorJS 集合与数组
【发布时间】:2013-12-28 13:28:25
【问题描述】:

我正在使用 MeteorJS 创建一个应用程序,该应用程序允许用户创建项目(例如,文本、图像)并在画布上以空间方式协作组织这些项目。可以创建多个画布。将来,项目可能会在(我不确定)多个画布之间重复使用或复制。我以前从未设计过协作(甚至是数据库驱动)应用程序。

我找不到创建嵌套 MeteorJS 集合的可能性,并且我不确定使用多个集合与在集合中使用对象数组的(不利)优势(例如考虑可伸缩性、速度),所以我想知道什么是好的设计模式:

答:

Collection Canvases {
    Canvas {
        Array Items;
    }
    Canvas {
        Array Items;
    }
}

乙:

Collection Items {
    Item {
       _id
    }
    Item {
       _id
    }
}

Collection Canvases {
    Canvas {
        Array ItemIDs;
    }
    Canvas {
        Array ItemIDs;
    }
}

或者也许是不同的东西?

【问题讨论】:

  • 我会使用两个集合,一个用于 Canvas,一个用于 Items。我会将父画布 ID 存储在 Items 集合中,这样您就可以轻松地找到特定画布中的所有项目,并将项目重新设置为另一个画布。画布{_id:"xxx"}项目{_id:"xxx",canvasId:"xxx"}

标签: meteor collaborative


【解决方案1】:

由于 Meteor “identifies changes based on the fields of the MongoDB document. But ... does not support nested fields and arrays”,我将使用您在提案 B 中建议的一些数据结构:两个集合。这样可以确保只有新的/更新的项目才会推送给客户端,而不是画布的所有项目。

然后将 Canvas 和 Items 之间的关系设为saimeunt 在上面的评论中指出的:Canvas{_id:"xxx"} Item{_id:"xxx",canvasId:"xxx"}。 (我在我的项目minutocash 中使用了类似的方法,效果很好。)

此外,您可以使用 publish-with-relations 包发布画布的所有相关项目,正如 David Weldon 在 this answer 中针对我的一个问题指出的那样,关于您可能会遇到的问题稍后会遇到这种数据结构。

【讨论】:

  • 所有这些看起来都是正确的。我通常更喜欢让我的流星集合保持相关性,即使这不是使用 mongodb 的推荐方式。它确实迫使您使用 PWR 之类的东西,但考虑到 0.7 中的新 oplog 拖尾,这似乎没什么大不了的。但是,如果您无法访问 oplog,则反应式连接可能会变得昂贵(CPU) - 所以请注意。
猜你喜欢
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2018-01-29
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多