你如何以及在哪里定义你的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项目将默认包含insecure
和autopublish
包。 前者基本上允许任何客户端以任何可能的方式改变你的数据库,即插入 , 更新和删除文件。 后者将确保所有数据库内容都发布给所有人,不pipe这听起来多么可笑。 但是不要害怕! 他们唯一的目标是在最初阶段简化开发过程。 只要你开始考虑任何types的安全问题,你应该从你的项目中摆脱这些。
只要从项目中删除insecure
软件包,您就可以通过定义MyCollection.allow
和MyCollection.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一个块注释,以解释我想要的结构是集合中的大部分还是全部文档,所以当我插入或更新集合的时候,我有一些东西需要引用文档。 但是,在这些插入或更新函数中,我要遵循我为自己定义的任何结构。