Meteor 的核心功能, 那就是服务器端和客户端的自动数据同步。
Meteor 集合(Collection)
集合是一个特殊的数据结构,它将你的数据存储到持久的、服务器端的 MongoDB 数据库中,并且与每一个连接的用户浏览器进行实时地同步。
在根文件夹建立一个叫做 collections/ 的文件夹, 并在里面放一个 posts.js 的文件。代码所在的目录既不是 client/ 也不是 server/ 所以 Posts 会共同存在运行在服务器和客户端。 然而,这个集合的使用在两种环境下十分不同。
连接到Mongo数据库
Posts = new Mongo.Collection('posts');
要 Var 还是不要 Var?
在 Meteor 中,关键字 var 限制对象的作用域在文件范围内。想要 Posts 作用于整个应用范围内,就不要 Var 这个关键字
存储数据
网络应用有三种基本方式保存数据,各种方式有不同的角色:
- 浏览器内存:像 JavaScript 变量的这些数据会保存在浏览器内存中,意味着他们不是永久性的:它们存在于当前浏览器标签中,当标签关闭后它们会消失。
- 浏览器存储:浏览器也可存储较为永久性的数据,使用 cookies 或本地存储 Local Storage。虽然数据会在不同 session 间保持,但是只是针对于当前用户(包括标签之间)但不能轻易地共享给其他用户。
- 服务器端数据库:你想永久保存数据并且提供给多个用户的最好方法是数据库(MongoDB 是 Meteor 应用默认的方案)。
Meteor 使用所有三种方式,有时会从一个地方同步数据到另一个地方(我们会马上看到)。话虽如此,数据库仍然是包含数据主副本的“规范化的”数据源。
客户端与服务器
不在 client/ 或 server/ 文件夹中代码会在客户端和服务器端运行。所以 Posts 集合在客户端和服务器端都可用。但是,在各自环境下所起的作用有很大不同。
在服务器,集合有一个任务就是和 Mongo 数据库联络,读取任何数据变化。 在这种情况下,它可以比对标准的数据库。
在客户端,集合是一个安全拷贝来自于实时一致的数据子集。客户端的集合总是(通常)透明地实时更新数据子集。
服务器端的集合
在服务器端的代码,可以写像 Posts.insert()或 Posts.update() 这样的 Mongo 命令,来对 Mongo 数据库中的 posts 集合进行操作。
meteor mongo 启动 Mongo Shell 外壳程序
输入 meteor logs myApp 得到应用的 log 日志
客户端集合
当在客户端申明 Posts = new Mongo.Collection('posts'); 实际上是创建了一个本地的,在浏览器缓存中的真实的 Mongo 集合。 客户端集合被"缓存"是指它保存了数据的一个子集,而且对这些数据提供了十分快速的访问。
因为这是 Meteor 工作的一个基础: 通常说来,客户端的集合的数据是 Mongo 数据库的所有数据的一个子集(毕竟不会想把整个数据库的数据全传到客户端来)。
第二,那些数据是被存储在浏览器内存中的,也就是说访问这些数据几乎不需要时间,不像去服务器访问 Posts.find() 那样需要等待,因为数据事实上已经载入了。
meteor reset清空数据库初始化我们的项目
meteor reset
动态数据
动态数据获取需要使用数据库方法,所以讲数据库导入前端client中的main.js中,调用方法的是遍历集合的标签,将多个数据的数组,需要通过domain helper方法调用。
连接集合: 发布与订阅
到此为止,我们仍然用着 autopublish 这个包,这个包并不是为正式产品化的应用程序准备的。正如它的名字陈述的那样,它简单地把整个集合分享给所有连接的客户端。这个可不是我们期望的样子,所以让我们去掉它。
打开一个终端窗口,输入:
meteor remove autopublish
这个操作有了立即的反应。当你打开浏览器,你会发现所有的帖子都不见了!这是因为我们一直依赖于 autopublish 来让我们的客户端可以镜像般地得到数据库中的所有帖子。
最终我们需要做得到我们仅仅把我们客户端需要看到的帖子传输过来(需要考虑分页的情况)。不过暂时我们可以先设置把 Posts 所有帖子都发布出来。
为达到这个目的,我们建立一个简单的 Publish() 函数,它仅仅返回一个反映所有帖子的游标。
Meteor.publish('posts', function() { return Posts.find(); });
在客户端我们需要订阅这个发布。我们仅仅需要增加这样一行到 main.js 文件中:
Meteor.subscribe('posts');
集合数据的增删改查
集合的创建
Post = new Mongo.Collection('post');
数据的增加
Post.insert(myData);
数据的查找
全部查找
var findCol = Posts.find().fetch();
按照需求查找
var a = Posts.find({'titl1':'大熊'}).fetch();
按照id查找
var myId = a[0]._id;
按条件查找单个数据
var f = Post.findOne({'title':'baidu'});
在 Meteor 中,find() 返回值是一个游标。游标是一种从动数据源。如果你想输出内容,你可以对游标使用 fetch() 来把游标转换成数组。
Meteor 十分智能地在应用中保持游标状态而避免动不动就把游标变成数组。这就造成了你不会经常在 Meteor 代码中看到 fetch() 被调用。
修改数据
var updata = {
titl1:'火影',
titl2:'鸣人',
titl3:'卡卡西'
}
Posts.update(myId,updata);
删除数据
Posts.remove(myId);
可以使用删除特定ID的方法删除数据