【问题标题】:How to get Collection using only collection name in Meteor 1.3?如何在 Meteor 1.3 中仅使用集合名称获取集合?
【发布时间】:2016-09-08 23:28:29
【问题描述】:

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

在代码包中使用类似:

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

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

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

【问题讨论】:

  • 相信你可以做到window[collectionName],见stackoverflow.com/a/20785981/2805154
  • 不,你不能。我的意思是它不能在服务器上运行,这就是我提到global 的原因。在 Meteor 1.3 中,您必须手动将 then 添加到全局空间中,这不是一个好的解决方案。这将迫使每个 Meteor 1.3 应用程序创建者(正在使用我的包)手动将他们的集合添加到全局空间中。使用 ES6 模块的主要思想是尽可能避免全局变量。

标签: meteor meteor-packages


【解决方案1】:

使用以下技巧

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

只需将用户替换为您拥有的任何集合即可。

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

【讨论】:

  • 这将返回基础集合而不是 Meteor.Collection,因此插入此集合无法正常工作。 IE。它出现在客户端,但不会发送到服务器。
【解决方案2】:

我建议不要像阿基米德建议的那样使用可能会在不通知的情况下更改的私有 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
}

【讨论】:

  • 不幸的是,这个解决方案不起作用,因为我需要它在包中,并且不想强迫其他应用程序强制使用一种或其他方式将集合放入全局名称空间。跨度>
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    欲了解更多信息结帐:

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

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

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

    【讨论】:

    • 为此我收到了TypeError: Cannot read property '_stores' of undefined :(
    • 很抱歉,请检查您的 Meteor 版本,因为这是 2015 年 12 月才添加的,但必须在 2016 年 2 月修复,我会用链接更新答案。
    • 这是流星 1.3.3.1
    • 哦,抱歉,这似乎只适用于客户端代码。
    • 那么这个解决方案不太合适。我需要一些我可以在服务器上的方法中使用的东西。所以我选择的import { CollectionExtensions } from 'meteor/lai:collection-extensions' 解决方案看起来是目前最好的解决方案。
    猜你喜欢
    • 2012-06-14
    • 2014-03-03
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多