在我的项目中,我正在使用需要集合名称的包在集合中进行一些搜索。我刚刚迁移到Meteor 1.3中,现在这个包不起作用。
在代码包中使用类似:
const search = (collection_name) => {
let collection = this[collection_name]
...
}
现在集合不再在全球范围内了。
我可以在我的global[collection_name] = Collection
中添加我的收藏lib/collections.js
,但我更愿意修改包以更灵活,并且Meteor 1.3兼容。
如果您只知道集合名称,是否有可能获得Mongo Collection?
答案 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
,如其他答案中所述。