按名称获取Meteor集合

Tre*_*ham 24 meteor

假设我写道:

new Meteor.Collection("foos");
new Meteor.Collection("bars");
Run Code Online (Sandbox Code Playgroud)

是否有用于按名称访问这些集合的API?喜欢的东西Meteor.Collection.get(name),在这里name"foos"还是"bars"?我知道我可以写类似的东西

var MyCollections = {
    foos: new Meteor.Collection("foos");
    bars: new Meteor.Collection("bars");
}
Run Code Online (Sandbox Code Playgroud)

然后使用MyCollections[name],但我更愿意使用现有的API(如果存在).

小智 15

基于Shane Donelley的mongoinspector https://github.com/shanedonnelly1/mongoinspector

getCollection = function (string) {
for (var globalObject in window) {
    if (window[globalObject] instanceof Meteor.Collection) {
        if (globalObject === string) {
            return (window[globalObject]);
            break;
        };        
    }
}
return undefined; // if none of the collections match
};
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么你循环`window`对象而不是做:`getCollection = function(string){return(window && window [string] && window [string] instanceof Meteor.Collection)?window [string]:undefined; }` (4认同)
  • 您可以在服务器中执行相同操作,使用******而不是***window***.代码是一样的,只需用******替换***window***,从全局命名空间中获取集合对象. (2认同)
  • 在全局上下文之外并在严格模式下,使用`var globals = Function('return this')();`来获取对Global对象的引用.所以在代码中用***globals***替换***window***. (2认同)

c.c*_*ier 12

我刚刚找到了这个软件包:https://github.com/dburles/mongo-collection-instances/

它允许你

Foo1 = new Mongo.Collection('foo'); // local
Foo2 = new Mongo.Collection('foo', { connection: connection });

Mongo.Collection.get('foo') // returns instance of Foo1

Mongo.Collection.get('foo', { connection: connection }); 
// returns instance of Foo2
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助

  • 请注意,不再需要此包,因为现在检索现有集合是内置功能. (3认同)

mal*_*hal 11

此功能在2016年2月添加到Meteor:"提供一种从客户端的商店访问集合的方法"

它的工作原理如下:

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

我使用它如下使用javascript控制台测试插入:

Meteor.connection._stores['tasks']._getCollection().insert({text:'test'});

对于插入,它需要insecure仍然安装包,否则获得访问被拒绝的消息.

  • 是否可以从服务器端和客户端调用它?我尝试了这段代码,总是得到**TypeError:无法在服务器端读取未定义**的属性'_stores'. (3认同)

小智 3

据我在collection.js源代码中看到,一旦在服务器上初始化了现有的 Collection,目前就无法在 api 中按名称获取现有的 Collection。添加该功能可能并不难。

那么,为什么不分叉 Meteor 并提交补丁或创建一个智能包并分享它,我确信还有其他人想要相同的功能。

  • 在 `Meteor.connection._mongo_livedata_collections` 上找到它 (8认同)
  • 这个答案已经过时了:现在有办法了,至少在客户端上是这样。请参阅此答案:http://stackoverflow.com/a/37938322/14637 (3认同)