在运行Meteor App时将MongoDB Collection从本地更改为服务器端

时间:2017-03-22 15:27:58

标签: mongodb meteor

由于Meteor Docs有'服务器端','客户端'和'本地'集合。有没有办法在正在运行的应用程序中更改“状态”(例如,如果它是服务器端,客户端或本地)?

用例:用户可以注册和登录的Web应用程序。他们可以存储合理的数据。根据用户的个人偏好,他应该能够选择是将数据存储在本地还是存储在服务器上(一般决定 - 不是根据具体情况而定)。

当前方法:如果我实例化Collection本地CollectionName = new Mongo.Collection(null);或服务器端CollectionName = new Mongo.Collection('collectionName');,它工作正常。 但我想不出一种让用户可以改变收集状态的方法。

有办法做到这一点吗? 或者是需要的解决方法(例如,创建两者,本地和服务器端Collaction,并决定使用哪个进行插入/更新/查找 - 这意味着什么是重复代码?!)。

编辑:为了使思考清晰:我希望用户能够选择他的数据是否存储在与服务器或集合同步而没有任何同步的集合中。

2 个答案:

答案 0 :(得分:1)

不,您无法在正在运行的应用中更改集合的类型。

我认为你对这些术语的含义感到困惑。 “客户端”集合不会永久存储在localstorage中。它只是意味着它是一个在浏览器内存中的集合。就像“服务器端”集合是那些驻留在服务器内存中 的集合一样。区别在于它是如何定义的,而是代码运行的位置。大多数集合都有客户端和服务器端对应,它们通过pub / sub保持同步。服务器端集合也与MongoDB同步(使用oplog)。

本地收藏可以存在于两个地方,但“本地”意味着它们不会与任何东西同步。

答案 1 :(得分:0)

我可能不完全明白你要做什么,但本地收藏不会保留数据。

  

如果您传递null作为名称,那么您将创建一个本地集合。它在任何地方都没有同步;它只是一个支持Mongo风格的查找,插入,更新和删除操作的本地暂存器。 (在客户端和服务器上,此暂存器是使用Minimongo实现的。)

这意味着当用户关闭浏览器时,客户端上添加的任何数据都会被吹走(除非您还使用其中一个local collection persist meteor packages),并且在服务器上添加的任何数据都会被烧毁当重新启动流星应用程序时离开。所以我不认为你真的想使用本地收藏品。

相反,我会使用常规集合(其中名称传递给构造函数)以及标准allowdeny选项(not really recommended} ...但仍然是有效方法)或流星方法(首选方法)来控制谁可以更改数据以及允许更改哪些数据。

或者,另一个选项可能是将您的发布函数传递给用户希望在该客户端上查看该字段的字段列表。为此,您定义了一个新的发布,该发布接收displayFields参数,然后将其用作集合.find()中的字段说明符选项。

Meteor.publish("userData", function (userId, displayFields) {
  // validate the structure and contents of displayFields

  // retrieve the data but only use the fields that the user requested
  return UserData.find({user_id: userId}, {fields: displayFields});
});

然后在客户端,您将订阅此内容并传入用户希望在客户端上显示的字段。

var displayFields = {
  firstname: 1, 
  lastname: 0,
  //...
};

this.subscribe("userData", [displayFields]);