如何在 Meteor 1.3 中仅使用 collection 名称获得 Collection?

How to get Collection using only collection name in Meteor 1.3?

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

在代码包中使用如下内容:

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

现在 collection 不再处于全局范围内。 我可以在我的 lib/collections.js 中添加我的 collection 做 global[collection_name] = Collection,但我宁愿修复包以更灵活和兼容 Meteor 1.3。

如果您只知道 collection 姓名,是否有任何可能如何获得 Mongo Collection?

使用以下技巧

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

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

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

我建议创建一个全局对象来保存您的集合,而不是像阿基米德建议的那样使用可能会更改而不另行通知的似乎是私有的 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
}

感谢@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
}

试试这个魔法(在客户端代码中):

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

查看更多信息:

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

meteor/meteor#6160(2016 年 2 月固定)

或者,如果您更喜欢 public API 并且不介意其他依赖项,请使用 mongo-collection-instances,如其他答案中所述。