按名称获取Meteor集合

时间:2012-06-11 16:28:29

标签: meteor

假设我写道:

new Meteor.Collection("foos");
new Meteor.Collection("bars");

是否有用于按名称访问这些集合的API?类似于Meteor.Collection.get(name),其中name"foos"还是"bars"?我知道我可以写点像

var MyCollections = {
    foos: new Meteor.Collection("foos");
    bars: new Meteor.Collection("bars");
}

然后使用MyCollections[name],但我更愿意使用现有的API。

11 个答案:

答案 0 :(得分: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
};

答案 1 :(得分: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

希望它会有所帮助

答案 2 :(得分:11)

此功能已于2016年2月添加至Meteor:"Provide a way to access collections from stores on the client"

它的工作原理如下:

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

我使用以下方法使用javascript控制台测试插入内容:

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

对于插入,它仍然需要安装insecure包,否则会收到拒绝访问的消息。

答案 3 :(得分:3)

据我所知,在collection.js源代码中,一旦已经在服务器上初始化了api,就无法通过名称获取现有的Collection。添加该功能可能并不困难。

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

答案 4 :(得分:1)

使用https://github.com/dburles/mongo-collection-instances,您可以使用Mongo.Collection.get('collectionname')

请注意,您插入的参数与创建集合时使用的参数相同。因此,如果您使用const Products = new Mongo.Collection('products'),则应使用get('products')(小写)。

答案 5 :(得分:0)

而不是看,我一直在做:

Foos = new Meteor.Collection("foos");

或者可能把它放在另一个对象中。我还没有真正制作Collections集合对象。

答案 6 :(得分:0)

请注意,它们具有返回值,因此您可以执行

var Patterns = new Meteor.Collection("patterns");

并在任何地方使用Patterns

当您需要订阅服务器更新时,请向"patterns"提供Meteor.subscribe()


如果你有多个集合的相同代码,那么从软件工程的角度来看,你做错了什么的可能性很高;为什么不使用带有type字段的单个集合(或区分文档的其他东西)并使用它而不是使用多个集合?

答案 7 :(得分:0)

正如其他人所提到的那样,似乎无法在创建时保存包装的Meteor.Collection对象而不保存它。

但至少有一种方法可以列出所有已创建的集合,并实际访问相应的Mongo LocalCollection对象。它们可以从任何Meteor Collection对象获得,因此为了保持通用性,您可以为此创建一个虚拟集合。使用这样的方法(CoffeeScript):

dummy = new Meteor.Collection 'dummy'
getCollection = (name) ->
  dummy._driver.collections[name]

这些对象确实包含了find,findOne,update等方法,甚至还有一些Meteor似乎没有公开的方法,比如看起来很有趣的pauseObservers和resumeObservers。但我没有尝试直接使用这个mongo LocalCollection引用知道它会相应地更新服务器集合。

答案 8 :(得分:-1)

var bars = new Meteor.Collection("foos");

根据collection.js的作用来判断,我们用来实例化集合对象的行打开了与数据库的连接,并查找与我们给出的名称相匹配的集合。因此在这种情况下建立连接并且集合'foos'绑定到Meteor.Collection对象'bars'。请参阅mongo-livedata包中的collection.js AND remote_collection_driver.js

与MongoDB一样,尽管可以,但您不必显式创建集合。如MongoDB文档中所述:

  

插入第一个文档时会创建一个集合。

所以,我认为你所追求的是你已经拥有的 - 除非我完全误解了你的意图。

答案 9 :(得分:-2)

有人想出一个解决方案吗?能够做到这一点真是太棒了:

Handlebars.registerHelper('getCollection', function(e) {
 return Meteor.collection(e) // or something like this
});

并拥有类似

的模板代码
  {{#each getCollection 'myCollection' }}

这会非常有用,因为我注意到有些裁员在做流星模板助手......

答案 10 :(得分:-2)

您可以随时滚动自己的自动收集器。

假设您有一些名为“商家”和“客户”的馆藏。将每个引用放入一些“集合”对象中,并注册Handlebars帮助程序以通过集合[“name”]访问这些“集合”。

即。把这样的东西放在客户端main.js

collections = collections || {};
collections.Businesses = Businesses;
collections.Clients = Clients;

Handlebars.registerHelper("getCollection", function(coll) {
  return  collections[coll].find();
});

然后在HTML中,只需按名称引用该集合:

{{#each getCollection 'Businesses'}}
  <div> Business: {{_id}} </div>
{{/each}}

{{#each getCollection 'Clients'}}
  <div> Client: {{_id}} </div>
{{/each}}

看看ma,不再需要通用的“列出所有记录”样板js!