流星将数据存储在集合中。 首先,使用新的Mongo.Collection声明一个集合。
集合的名称。 如果为null,则创建一个非托管(未同步)的本地集合。
将管理此集合的服务器连接。 如果未指定,则使用默认连接。 传递调用DDP.connect的返回值来指定一个不同的服务器。 通过null来指定没有连接。 非托管(名称为空)集合无法指定连接。
转换函数
一个可选的转换函数。 文件在从fetch或findOne返回之前,在传递给观察,映射,forEach,allow和deny的回调函数之前将通过此函数传递。 对于observeChanges的回调或从发布函数返回的游标,转换不适用。
设置为false可跳过设置允许从客户端代码插入/更新/删除的突变方法。 默认为true。
调用这个函数类似于在传统的ORM(Object-Relation Mapper)对象框架中声明一个模型。 它建立一个可用于存储特定类型信息的集合(记录存储空间或“文档”),如用户,帖子,分数,待办事项或任何与您应用程序有关的事物。 每个文档都是一个EJSON对象。 它包含一个_id属性,其值在集合中是唯一的,当您第一次创建文档时,Meteor将设置它。
该函数返回一个对象,其中包含将文档插入到集合中的方法,更新其属性并将其删除,并查找符合任意条件的集合中的文档。 这些方法的工作方式与流行的Mongo数据库API兼容。 相同的数据库API可以在客户端和服务器上工作(见下文)。
如果您在创建集合时传递了一个名称,那么您正在声明一个持久集合 -一个存储在服务器上并被所有用户看到的集合。 客户端代码和服务器代码都可以使用相同的API访问相同的集合。
具体来说,当你传递一个名字时,会发生以下情况:
在服务器上(如果您不指定连接),将在后端Mongo服务器上创建具有该名称的集合。当你在服务器上调用这个集合上的方法时,它们直接转换成正常的Mongo操作(在检查它们符合你的访问控制规则之后)。
在客户端上(如果指定连接,则在服务器上),创建一个Minimongo实例。 Minimongo本质上是纯JavaScript中的内存中非持久化的Mongo实现。它充当本地缓存,仅存储该客户端正在使用的数据库的子集。对这些集合的查询(查找)直接从这个缓存中提供,而不与服务器通话。
当你写入到客户端的数据库(插入,更新,删除)时,命令立即在本地执行,并且同时发送到服务器并在那里执行。这通过存根发生,因为写入是作为方法实现的。
在服务器上写入到与另一台服务器有指定连接的集合时,它会将相应的方法发送到另一台服务器,并通过DDP从其接收更改后的值。 与客户端不同,它不首先在本地执行写入。
如果您传递null作为名称,那么您正在创建一个本地集合。 它不在任何地方同步。 它只是一个本地暂存器,支持Mongo风格的查找,插入,更新和删除操作。 (在客户端和服务器上,这个暂存器都是用Minimongo来实现的。)
默认情况下,Meteor将自动收集每个文档到每个连接的客户端。 要关闭此行为,请删除终端中的autopublish包:
而是调用Meteor.publish来指定哪些部分应该发布给哪些用户。
一般来说,您将在应用程序中将Mongo.Collection对象分配给全局变量。 您只能为每个基础Mongo集合创建一个Mongo.Collection对象。
如果您为集合或其任何检索方法指定了一个转换选项,那么文档将在返回或传递给回调之前通过转换函数传递。 这使您可以添加方法或以其他方式从数据库表示中修改集合的内容。 您也可以在特定查找,findOne,允许或拒绝呼叫中指定转换。 转换函数必须返回一个对象,并且它们不能改变文档的_id字段的值(尽管可以忽略它)。
变换函数不被称为被动的。 如果要将动态更改的属性添加到对象,请使用在调用时计算值的函数,而不是在变换时计算属性。
在这个版本中,Minimongo有一些限制:
修改器中的$ pull只能接受某些类型的选择器。
findAndModify,聚合函数和map / reduce不受支持。
所有这些将在未来的版本中解决。有关完整的Minimongo发行说明,请参阅存储库中的packages / minimongo / NOTES。
Minimongo目前没有索引。 这很少会成为一个问题,因为客户拥有足够的数据以至于索引是值得的。
查找返回一个游标。 它不会立即访问数据库或返回文档。 游标提供获取返回所有匹配的文件,映射和forEach遍历所有匹配的文件,并观察和观察变化注册回调,当匹配的文件组更改。 游标也实现ES2015的迭代协议。
集合游标不是查询快照。 如果数据库在调用Collection.find和获取游标结果之间或在从游标中获取结果时发生变化,那么这些变化可能会出现在结果集中,也可能不会出现在结果集中。
游标是一个被动数据源。 在客户端,第一次在反应计算(例如模板或自动运行)中检索游标的文档,包括fetch,map或forEach时,Meteor将注册对基础数据的依赖关系。 对更改光标中文档的集合的任何更改都会触发重新计算。 要禁用此行为,请将{reactive:false}作为选项进行查找。
请注意,指定字段时,只有对包含字段的更改才会触发观察,观察更改和回调计算中的使用此光标的无效计算中的回调。 仔细使用字段允许对不依赖整个文档的计算实现更精细的反应。
在客户端,从加载页面到发布数据从服务器到达您的客户端集合为空时,将会有一段时间。
按排序和跳过选项排序,查找与选择器匹配的第一个文档。 如果未找到匹配的文档,则返回undefined。
在集合中插入一个文档。 返回其唯一的_id。
要插入的文档。 可能还没有_id属性,在这种情况下Meteor会为你生成一个属性。
可选的。 如果存在,用一个错误对象作为第一个参数调用,如果没有错误,则_id作为第二个参数。
将文档添加到集合中。 文档只是一个对象,其字段可以包含EJSON兼容数据类型(数组,对象,数字,字符串,null,true和false)的任意组合。
插入将为您传递的对象生成唯一的ID,将其插入到数据库中,然后返回ID。 当从不可信的客户端代码调用插入时,只有在传递任何适用的允许和拒绝规则时才允许插入。
在服务器上,如果不提供回调,则插入块直到数据库确认写入,否则在出错时引发异常。 如果您提供回调,插入仍然立即返回ID。 一旦插入完成(或失败),回调将被调用,并带有错误和结果参数。 在错误情况下,结果是未定义的。 如果插入成功,错误是未定义的,结果是新的文档ID。
在客户端,插入永不阻止。 如果您没有提供回调,并且服务器上的插入失败,那么Meteor将向控制台发出警告。 如果你提供了一个回调,Meteor会用错误和结果参数来调用这个函数。 在错误情况下,结果是未定义的。 如果插入成功,错误是未定义的,结果是新的文档ID。
修改集合中的一个或多个文档。 返回匹配文档的数量。
指定要修改的文档
指定如何修改文档
可选的。 如果存在,则用错误对象作为第一个参数调用,如果没有错误,则将受影响的文档数作为第二个参数。
确实修改所有匹配的文件;为false只修改其中一个匹配文档(默认)。
如果没有找到匹配的文档,则为真即插入文档。
根据修饰符修改与选择器匹配的文档(请参阅修改器文档)。
更新的行为取决于它是由受信任的或不受信任的代码调用。 受信任的代码包括服务器代码和方法代码。 不受信任的代码包括客户端代码,如事件处理程序和浏览器的JavaScript控制台。
可信代码可以通过将multi设置为true来同时修改多个文档,并且可以使用任意的Mongo选择器来查找要修改的文档。 它绕过了允许和拒绝设置的任何访问控制规则。 如果您未通过回叫,受影响文件的数量将从更新通话中返回。
不受信任的代码只能一次性修改单个文档,由其_id指定。 只有在检查任何适用的允许和拒绝规则后才允许修改。 受影响的文档数量将返回到回调。 不受信任的代码不能执行upserts,除非在不安全的模式下。
在服务器上,如果不提供回调,则更新数据块直到数据库确认写入,否则在出错时引发异常。 如果您提供回调,则立即返回更新。 更新完成后,如果失败,则使用单个错误参数调用回调,如果更新成功,则使用第二个参数指示受影响的文档数。
在客户端上,更新永远不会阻塞。 如果您不提供回调,并且服务器上的更新失败,那么Meteor将向控制台发出警告。 如果您提供回调,则Meteor会在出现错误时使用错误参数调用该函数,如果更新成功,则会使用第二个参数指示受影响的文档的数量。
你可以使用update来设置upsert选项为true来执行Mongo upsert。 您还可以使用upsert方法执行一个upsert,除了受影响的文档数量外,还会返回插入的文档的_id(如果有的话)。
修改集合中的一个或多个文档,或者如果找不到匹配的文档,则插入一个。 返回键为numberAffected的对象(已修改的文档数)和insertedId(插入的文档的唯一_id,如果有的话)。
根据修饰符修改与选择器匹配的文档,或者如果没有文档被修改,则插入文档。 upsert与upsert选项设置为true时调用update相同,除了upsert的返回值是包含关键字numberAffected和insertedId的对象。 (更新只返回受影响文档的数量。)
找到与选择器匹配的所有文档,并将其从集合中删除。
删除行为取决于它是由受信任的或不受信任的代码调用。 受信任的代码包括服务器代码和方法代码。 不受信任的代码包括客户端代码,如事件处理程序和浏览器的JavaScript控制台。
受信任的代码可以使用任意的Mongo选择器来查找要删除的文档,并且可以通过传递与多个文档匹配的选择器来一次删除多个文档。 它绕过了允许和拒绝设置的任何访问控制规则。 如果您未传递回叫,则删除的文档数将从删除中返回。
作为安全措施,如果省略选择器(或未定义),则不会删除任何文档。 如果您确实要从集合中删除所有文档,请将选择器设置为{}。
不受信任的代码一次只能删除单个文档,由其_id指定。 只有在检查任何适用的允许和拒绝规则后,文档才被删除。 被删除的文件的数量将被返回到回调。
在服务器上,如果不提供回调,则删除块直到数据库确认写入,然后返回已删除文档的数量,否则在出错时引发异常。 如果您提供回调,请立即删除退货。 一旦删除完成,回调在失败的情况下被调用一个错误参数,或者如果删除成功,则第二个参数指示被删除的文档的数量。
在客户端上,删除从不阻止。 如果您不提供回调,并且在服务器上删除失败,那么Meteor将向控制台发出警告。 如果提供回调,则Meteor会在出现错误时使用错误参数调用该函数,如果移除成功,则会使用第二个参数指示已移除文档的数量。
允许用户直接从客户端代码写入这个集合,但要受到您定义的限制。
虽然允许和拒绝使得开始构建应用程序变得容易,但是似乎编写安全允许和拒绝规则似乎更困难。 我们建议开发人员避免允许和拒绝,并在他们准备从应用程序中删除不安全模式时直接切换到自定义方法。 有关更多详细信息,请参阅关于安全的流星指南。
当客户端调用插入,更新或删除集合时,集合的允许和拒绝回调将在服务器上调用,以确定是否允许写入。 如果至少有一个允许回调允许写入,并且没有拒绝回调否认写入,则允许写入继续。
这些检查仅在客户端试图直接写入数据库时运行,例如通过调用事件处理程序中的更新。 服务器代码是可信的,不受限制和拒绝。 这包括用Meteor.call调用的方法 -它们被期望进行自己的访问检查,而不是依赖允许和拒绝。
您可以根据需要多次呼叫允许,每个呼叫可以包含插入,更新和删除功能的任意组合。 如果他们认为这个操作应该被允许的话,函数应该返回true。 否则,他们应该返回false,或者什么也没有(undefined)。 在这种情况下,流星将继续搜索收集中的任何其他允许规则。
用户userId想要将文档文档插入到集合中。 如果允许,返回true。
doc将包含_id字段,如果一个是由客户端显式设置,或者如果有一个活动转换。 你可以使用这个来防止用户指定任意的_id字段。
用户userId想要更新文档文档。 (doc是来自数据库的文档的当前版本,没有建议的更新。)返回true以允许更改。
只支持Mongo修饰符(像$ set和$ push这样的操作)。 如果用户试图替换整个文档而不是使用$ --modifiers,那么请求将被拒绝,而不检查允许的功能。
用户userId想要从数据库中删除文档。 返回true来允许这个。
当调用更新或删除Meteor将默认从数据库中获取整个文档文档。 如果你有大的文档,你可能只想获取你的函数实际使用的字段。 通过将fetch设置为要检索的字段名称数组来完成此操作。
如果您从未在集合上设置任何允许规则,则所有写入集合的客户端都将被拒绝,并且只能从服务器端代码写入集合。 在这种情况下,您将不得不为客户端允许的每个可能的写入创建一个方法。 然后,您将使用Meteor.call调用这些方法,而不是让客户端直接在集合上调用插入,更新和删除。
流星还有一个特殊的“不安全模式”,用于快速建立新应用程序的原型。 在不安全的模式下,如果您还没有在集合上设置任何允许或拒绝规则,则所有用户都具有对集合的完全写入权限。 这是不安全模式的唯一影响。 如果您在某个集合(甚至是Posts.allow({})上调用允许或拒绝,则在该集合上对访问进行检查就像正常一样。 新流星项目默认情况下以不安全模式启动。 要关闭它,只需在终端中运行:
查看对数据库的建议修改的函数,如果应该被拒绝,则返回true,即使允许规则另有说明。
可选的性能增强。 限制将从数据库中提取的字段,以便通过更新进行检查并删除函数。
覆盖对集合的转换。 通过null来禁用转换。
虽然允许和拒绝使得开始构建应用程序变得容易,但是似乎编写安全允许和拒绝规则似乎更困难。 我们建议开发人员避免允许和拒绝,并在他们准备从应用程序中删除不安全模式时直接切换到自定义方法。 有关更多详细信息,请参阅关于安全的流星指南。
这就像允许,除非它允许你确保某些写入被肯定拒绝,即使有一个允许规则说明他们应该被允许。
当客户端尝试写入集合时,Meteor服务器首先检查集合的拒绝规则。 如果没有一个返回true,那么它会检查该集合的允许规则。 只有当没有拒绝规则返回true并且至少有一个允许规则返回true时,Meteor才允许写入。
从Mongo.Collection包装的npm mongodb驱动程序模块返回与此集合对应的Collection对象。
从由Mongo.Collection包装的npm mongodb驱动程序模块返回与此集合的数据库连接对应的Db对象。
要创建一个游标,使用find。 要访问游标中的文档,请使用forEach,map,fetch或ES2015的迭代协议。
为每个匹配的文档,按顺序和同步调用一次回调。
该接口与Array.forEach兼容。
当从被动计算中调用时,forEach注册对匹配文档的依赖关系。
映射所有匹配文件的回调。 返回一个数组。
该接口与Array.map兼容。
当从被动计算中调用时,映射寄存器对匹配文档的依赖关系。
在服务器上,如果回调产生,在第一个呼叫等待期间可能发生其他回呼。 如果需要严格的顺序执行,请使用forEach。
以数组形式返回所有匹配的文档。
当从被动计算中调用时,获取寄存器对匹配文档的依赖关系。
返回与查询匹配的文档数量。
如同其他功能一样,只计算匹配文档数量的依赖性。 (只更改或重新排序结果集中文档的更新不会触发重新计算。)
观看一个查询。 在结果集更改时接收回调。
建立一个实时查询,当查询结果发生变化时调用回调。 回调会收到受影响文档的全部内容以及旧内容(如果适用)。 如果您只需要接收更改的字段,请参阅observeChanges。
当您不关心结果集中文档的顺序时,使用添加,更改和删除。 他们比添加更有效率,更改了,并删除了。
在观察返回之前,添加(或addedAt)将被调用零次或更多次来传递查询的初始结果。
观察返回一个实时查询句柄,这是一个停止方法的对象。 呼叫停止没有参数停止调用回调函数并拆除查询。 查询将永远运行,直到你打电话给这个。 如果从Tracker.autorun计算中调用观察,则在重新运行或停止计算时会自动停止观察。 (如果光标是通过选项reactive设置为false创建的,则只会传递初始结果,不会调用任何进一步的回调;不需要在句柄上调用stop。)
观看一个查询。 在结果集更改时接收回调。 只有旧文件和新文件之间的差异传递给回调。
监听一个实时查询,当查询结果发生变化时调用回调。 与观察相反,observeChanges仅提供新旧结果集之间的差异,而不是所更改文档的全部内容。
如果不使用addedBefore或movedBefore,observeChanges会显着更高效。
在observeChanges返回之前,添加(或addedBefore)将被调用零次或多次来传递查询的初始结果。
observeChanges返回一个活动的查询句柄,它是一个停止方法的对象。 呼叫停止没有参数停止调用回调函数并拆除查询。 查询将永远运行,直到你打电话给这个。 如果从Tracker.autorun计算中调用observeChanges,则在重新运行或停止计算时会自动停止。 (如果光标是通过选项reactive设置为false创建的,则只会传递初始结果,不会调用任何进一步的回调;不需要在句柄上调用stop。)
不像观察,观察变化不提供绝对的位置信息(即,在指数位置,而不是位置之前)。这是为了效率。
创建一个Mongo风格的ObjectID。如果不指定hexString,则ObjectID将随机生成(不使用MongoDB的ID构造规则)。
可选的。 要创建的ObjectID的24个字符的十六进制内容
Mongo.ObjectID遵循与Node MongoDB驱动程序ObjectID类相同的API。请注意,您必须使用equals方法(或EJSON.equals)来比较它们; ===运算符将不起作用。如果您正在编写需要处理可能是字符串或ObjectID的_id字段的泛型代码,请使用EJSON.equals而不是===来比较它们。
由Meteor创建的ObjectID值不会有getTimestamp方法的有意义的答案,因为Meteor目前完全随机地构造它们。
最简单的选择器只是一个字符串或Mongo.ObjectID。 这些选择器将文档与其_id字段中的值匹配。
一个稍微复杂的选择器形式是一个包含必须在文档中匹配的一组键的对象:
但是他们也可以包含更复杂的测试:
See the complete documentation.
修饰符是一个对象,它描述了如何通过改变其中的一些字段来更新文档。 一些例子:
但是,如果一个修饰符不包含任何$ -operators,那么它将被解释为一个文字文档,并完全替代以前在数据库中的任何东西。 (Literal文档修饰符当前不被验证的更新支持。)
排序可以使用您选择的几种语法来指定:
最后的形式只有在你的JavaScript实现保留了对象中键的顺序的情况下才能工作。 大多数情况下,大部分时间都这样做,但这取决于你自己。
对于本地集合,您可以传递一个比较函数,它接收两个文档对象,如果第一个文档第一个按顺序排列,则返回-1;如果第二个文档排在第一个,则返回1;如果两个文档都不在另一个之前,则返回0。 这是MongoDB的Minimongo扩展。
查询可以指定一组特定的字段来包含或从结果对象中排除。
要从结果对象中排除特定字段,字段说明符是一个字典,其键是字段名,值为0.所有未指定的字段都包含在内。
要仅包含结果文档中的特定字段,请使用1作为值。 _id字段仍然包含在结果中。
除了一个例外,不能混合包含和排除样式:键必须全部为1或全为0.例外是,您可以在包含说明符中指定_id:0,这将使_id超出结果对象 以及。 但是,此类字段说明符不能与observeChanges,观察,从发布函数返回的游标或模板中的{{#each}}中使用的游标一起使用。 它们可以与fetch,findOne,forEach和map一起使用。
例如$和$ elemMatch等字段操作符在客户端尚不可用。
一个更高级的例子:
在开发应用程序时,Meteor启动一个本地MongoDB实例并自动连接到它。 在生产环境中,您必须以标准的mongo连接字符串格式指定一个指向数据库的MONGO_URL环境变量。
如果你想连接到不同的MongoDB实例,你也可以在开发中设置MONGO_URL。
如果你想使用oplog tailing进行livequeries,你还应该设置MONGO_OPLOG_URL(通常你需要一个特殊的用户来访问oplog,但是细节可以根据MongoDB的不同而有所不同)。
从Meteor 1.4开始,您必须确保您在METEOR_OPLOG_URL上设置了replicaSet参数