我正在查看Meteor的文档,并举几个例子。我对两件事情感到有些困惑:首先,你在哪里构建数据库(记住安全性)?我是否将其全部保存在服务器/私人文件夹中以限制客户端访问?第二,如何定义结构?例如,他们显示的代码:
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"});
我不明白如何定义集合的结构。他们只是能够定义一个集合并将任意数据投入其中吗?
答案 0 :(得分:3)
要回答关于将new Meteor.Collection
语句放在何处的第一个问题,它们应该放在客户端和服务器都可访问的文件夹中的.js文件中,例如/collections
。 (除了一些例外:任何从未同步到客户端的集合,如服务器日志,应该在某个地方/server
内定义;任何local collections都应该在客户端代码中定义。)
至于关于结构的第二个问题:MongoDB是一个文档数据库,根据定义它没有结构。根据{{3}}:
数据库包含一组集合。一个集合拥有一套 文档。文档是一组键值对。文件有 动态架构。动态架构意味着文档在同一个 集合不需要具有相同的字段或结构集, 集合文档中的公共字段可以包含不同的类型 数据。
您可能也听说过这个名为NoSQL的内容。每个文档(SQL术语中的记录)可以具有不同的字段。因此,没有为集合定义初始结构的地方;每个文档在插入或更新时都会定义其“结构”。
在实践中,我喜欢在每个new Meteor.Collection
语句上面创建一个块注释,解释我打算将该结构用于该集合中的大多数或所有文档,所以我稍后会在插入时参考或更新集合的文档。但是我在那些插入或更新函数中遵循我为自己定义的任何结构。
答案 1 :(得分:2)
一个好的做法可能是使用一点javascript代码在客户端和服务器上定义您的集合。换句话说,请填写以下内容
MyCollection = new Meteor.Collection("rooms");
// ...
在client
和server
目录中的任何地方都没有。请注意,仅此指令不会将任何敏感数据暴露给任何人。
一个全新的流星项目默认包含insecure
和autopublish
个包。前者基本上允许任何客户以各种可能的方式更改您的数据库,即插入,更新和删除文档。后者将确保所有数据库内容都发布给每个人,无论这听起来多么荒谬。但不要害怕!他们唯一的目标是在早期阶段简化开发过程。一旦你开始考虑任何类型的安全问题,你应该从你的项目中删除这些。
只要从项目中删除insecure
包,您就可以通过定义MyCollection.allow
和MyCollection.deny
规则来控制数据库权限。有关详细信息,请查看documentation。我在这里唯一要提到的是这段代码应该被视为一个敏感代码,所以我想你应该把它放到你的server
目录中。
删除autopublish
包会对将发送给您的客户端的数据集产生影响。您可以再次控制它并通过实现自定义Meteor.publish
例程来定义您选择的特权。这些都记录在案here。在这里,你别无选择。代码只能在服务器环境中运行,因此最好的选择是将其放在server
目录中。
关于你的第二个问题。关于 NoSQL 数据库(如 mongodb )的全部讨论是尽可能少地限制数据库的结构。换句话说,集合的结构只取决于您。您不必定义任何模型,您可以随时更改文档的结构(和/或删除字段)。听起来不是很棒吗? :)