你如何以及在哪里定义你的meteor数据库结构?

我正在看Meteor的文档,它给出了几个例子。 我对两件事情有点困惑:首先,你在哪里build立数据库(牢记安全)? 我是否全部保存在服务器/私人文件夹中以限制客户端访问? 其次,我如何定义结构? 例如,他们显示的代码:

Rooms = new Meteor.Collection("rooms"); Messages = new Meteor.Collection("messages"); Parties = new Meteor.Collection("parties"); Rooms.insert({name: "Conference Room A"}); var myRooms = Rooms.find({}).fetch(); Messages.insert({text: "Hello world", room: myRooms[0]._id}); Parties.insert({name: "Super Bowl Party"}); 

我不明白集合的结构是如何定义的。 他们只是能够定义一个集合,并将任意数据扔进它?

一个好的做法可能是在客户端和服务器上用一点javascript代码来定义你的集合。 换句话说,放在下面

 MyCollection = new Meteor.Collection("rooms"); // ... 

任何地方,但不在client也不在server目录。 请注意,这个指令本身不会向任何人暴露任何敏感数据。

一个全新的meteor项目将默认包含insecureautopublish包。 前者基本上允许任何客户端以任何可能的方式改变你的数据库,即插入更新删除文件。 后者将确保所有数据库内容都发布给所有人,不pipe这听起来多么可笑。 但是不要害怕! 他们唯一的目标是在最初阶段简化开发过程。 只要你开始考虑任何types的安全问题,你应该从你的项目中摆脱这些。

只要从项目中删除insecure软件包,您就可以通过定义MyCollection.allowMyCollection.deny规则来控制数据库特权。 请检查文档以获取更多详细信息。 我唯一想提到的是这个代码应该被认为是一个敏感的代码,所以我想你应该把它放到你的server目录中。

删除autopublish包会影响将发送给客户端的一组数据。 再次,您可以通过实施自定义Meteor.publish例程来控制它并定义您select的Meteor.publish 。 这里全部logging在案。 在这里,你没有select。 代码只能在服务器环境下运行,所以最好的select是把它放在server目录下。

关于你的第二个问题。 关于NoSQL数据库(如mongodb )的整个讨论是尽可能less地限制数据库的结构。 换句话说,collections品的结构如何才取决于你。 您不必定义任何模型,并且可以随时更改文档的结构(和删除字段)。 听起来不错吗? 🙂

要回答你的第一个问题,那就是放置new Meteor.Collection语句,它们应该放在客户端和服务器可以访问的文件夹中的.js文件中,比如/collections 。 (除了一些例外:从不同步到客户端的任何集合,例如服务器日志,都应该在/server某个地方定义;任何本地集合都应该在客户端代码中定义。

至于你关于结构的第二个问题:MongoDB是一个文档数据库,它根据定义没有结构。 根据文档 :

数据库包含一组集合。 集合包含一组文档。 文档是一组键值对。 文档具有dynamic模式。 dynamic模式意味着相同集合中的文档不需要具有相同的字段或结构集合,并且集合的文档中的公共字段可以保存不同types的数据。

你也可能听说过这个NoSQL。 每个文档(用SQL说法logging)可以有不同的字段。 因此,你无法为集合定义初始结构。 每个文档在插入或更新时都会定义它的“结构”。

实际上,我喜欢在每个new Meteor.Collection声明上面创build一个块注释,以解释我想要的结构是集合中的大部分还是全部文档,所以当我插入或更新集合的时候,我有一些东西需要引用文档。 但是,在这些插入或更新函数中,我要遵循我为自己定义的任何结构。