如何在Meteor 1.3中仅使用集合名称获取集合?

如何在Meteor 1.3中仅使用集合名称获取集合?,meteor,meteor-packages,Meteor,Meteor Packages,在我的项目中,我使用需要集合名称的包在集合内进行搜索。我刚移植到Meteor 1.3,现在这个软件包不起作用了 在代码包中,请使用以下内容: const search = (collection_name) => { let collection = this[collection_name] ... } 现在集合不再在全局范围内。 我可以将我的收藏添加到我的lib/collections.js中的global[collection\u name]=collection,但我

在我的项目中,我使用需要集合名称的包在集合内进行搜索。我刚移植到Meteor 1.3,现在这个软件包不起作用了

在代码包中,请使用以下内容:

const search = (collection_name) => {
   let collection = this[collection_name]
   ...
}
现在集合不再在全局范围内。 我可以将我的收藏添加到我的
lib/collections.js
中的
global[collection\u name]=collection
,但我更希望修复该软件包,使其更灵活,与Meteor 1.3兼容


如果您只知道集合名称,是否有可能获得Mongo集合?

使用以下技术

Meteor.default_connection._mongo_livedata_collections.users.find({}).fetch()
只要用您拥有的任何集合替换用户即可


我建议创建一个全局对象来保存您的收藏,而不是像阿基米德建议的那样使用一个似乎是私有的api,它可能会在不通知的情况下更改。《流星》文件明确指出:

通常,您会将应用程序中的Mongo.Collection对象分配给全局变量。您只能为每个基础Mongo集合创建一个Mongo.Collection对象。

因此,如果您有一个
Collections
global,您可以通过
Collections[name]
轻松访问相关集合。当然,您确实希望限制全局值,因此,如果您的应用程序当前确实有一个全局值,只需给它一个属性来保存您的集合即可。以下是一种常见的模式,您可以根据自己的需要进行调整,无论您的集合位于单个文件中还是单独存在

app = app || {};
app.collections = {
    // collections here
}

感谢@sashko推荐,我看了一下,然后看了
lai:collection extensions
,下面是我如何解决的:

import { CollectionExtensions } from 'meteor/lai:collection-extensions'

let registered_collections = {}
CollectionExtensions.addExtension(function (name, options) {
  registered_collections[name] = {
    name: name,
    instance: this,
    options: options
  };
});

export function getCollectionByName(collecion_name) {
    return registered_collections[collecion_name].instance
}
试试这个魔术(在客户端代码中):

有关更多信息,请参阅:

(首次尝试2015年12月)

(2016年2月固定)


或者,如果您更喜欢公共API,并且不介意另一个依赖项,请使用另一个答案中提到的
mongo collection instances

我相信您可以使用
window[collectionName]
,请参见“否”,您不能。我的意思是它不能在服务器上工作,这就是为什么我提到了
global
。在Meteor 1.3中,您必须手动将其添加到全局空间,这不是一个好的解决方案。这将迫使每个Meteor 1.3应用程序创建者(使用我的软件包)手动将其收藏添加到全球空间。使用ES6模块的主要思想是尽可能避免全局性。不幸的是,此解决方案不起作用,因为我需要它在软件包中,不想强制其他应用程序使用一种或其他方式将集合放入全局名称空间。这将返回基础集合,而不是Meteor。集合,因此,对此的插入无法正常工作。也就是说,它出现在客户端上,但未发送到服务器。我得到
TypeError:无法读取未定义的属性“\u stores”
:(很抱歉,请检查您的Meteor版本,因为该版本仅在2015年12月添加,但必须在2016年2月修复,我将使用链接更新答案。Meteor 1.3.3.1Oh很抱歉,这似乎只是针对客户端代码。那么此解决方案不适合。我需要一些我可以在服务器上的方法中使用的内容。因此,我选择了带有
导入的解决方案“meteor/lai:collection extensions”中的{CollectionExtensions}
看起来是目前最好的解决方案。
Meteor.connection._stores['tasks']._getCollection()