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

时间:2016-05-12 22:41:22

标签: meteor meteor-packages

在我的项目中,我正在使用需要集合名称的包在集合中进行一些搜索。我刚刚迁移到Meteor 1.3中,现在这个包不起作用。

在代码包中使用类似:

const search = (collection_name) => {
   let collection = this[collection_name]
   ...
}

现在集合不再在全球范围内了。 我可以在我的global[collection_name] = Collection中添加我的收藏lib/collections.js,但我更愿意修改包以更灵活,并且Meteor 1.3兼容。

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

4 个答案:

答案 0 :(得分:1)

我建议创建一个全局对象来保存您的馆藏,而不是使用可能在没有通知的情况下改变的私人api,如阿基米德所建议的那样。流星文档明确指出:

Generally, you'll assign Mongo.Collection objects in your app to global variables. You can only create one Mongo.Collection object for each underlying Mongo collection.

因此,如果您拥有Collections全局,则可以通过Collections[name]轻松访问相关集合。当然你确实希望限制你的全局变量,所以如果你现在有一个全局的应用程序,只需给它一个属性来保存你的集合。以下是您可以根据自己的需求进行调整的常见模式,无论您的收藏集是单个文件还是单独存储。

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

答案 1 :(得分:1)

感谢@sashko推荐,我查看了https://github.com/dburles/mongo-collection-instances,然后查看了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
}

答案 2 :(得分:0)

使用以下技术

Meteor.default_connection._mongo_livedata_collections.users.find({}).fetch()

只需用您拥有的任何集合替换用户。

https://forums.meteor.com/t/es6-global-collection-variables/22392/2?u=trajano

答案 3 :(得分:0)

尝试这种魔力(在客户端代码中):

Meteor.connection._stores['tasks']._getCollection()

了解更多信息:

meteor/meteor#5845(初步尝试2015年12月)

meteor/meteor#6160(2016年2月修复)

或者如果您更喜欢公共API,请不要介意另一个依赖项使用mongo-collection-instances,如其他答案中所述。