Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 按名称获取流星收藏_Meteor - Fatal编程技术网

Meteor 按名称获取流星收藏

Meteor 按名称获取流星收藏,meteor,Meteor,假设我写: new Meteor.Collection("foos"); new Meteor.Collection("bars"); 是否有用于按名称访问这些集合的API?类似于Meteor.Collection.get(name),其中name是“foos”还是“bar”?我知道我可以写这样的东西 var MyCollections = { foos: new Meteor.Collection("foos"); bars: new Meteor.Collection("b

假设我写:

new Meteor.Collection("foos");
new Meteor.Collection("bars");
是否有用于按名称访问这些集合的API?类似于
Meteor.Collection.get(name)
,其中
name
“foos”
还是
“bar”
?我知道我可以写这样的东西

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

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

我只是做了以下工作,而不是查看:

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

或者可能把它放在另一个物体里。我还没有真正创建一个Collections collection对象。

据我在
collection.js
源代码中所见,在服务器上初始化现有集合后,api中目前无法按名称获取该集合。添加该功能可能并不难


那么,为什么不使用fork Meteor并提交一个补丁或创建一个智能包并共享它呢?我相信还有其他人也希望使用相同的功能。

请注意,它们有一个返回值,所以您可以这样做

var Patterns = new Meteor.Collection("patterns");
并在任何地方使用
模式

当您需要订阅服务器更新时,请向Meteor.subscribe()提供
“模式”


如果您对多个集合使用相同的代码,那么从软件工程的角度来看,您很有可能犯了错误;为什么不将一个集合与
类型
字段(或区别文档的其他内容)一起使用,而不是使用多个集合

var bars = new Meteor.Collection("foos");
根据collection.js的功能判断,我们用来实例化集合对象的行打开了到数据库的连接,并查找与我们给出的名称匹配的集合。因此,在本例中建立了连接,集合“foos”绑定到Meteor.collection对象“bar”。请参阅mongo livedata包中的
collection.js
remote\u collection\u driver.js

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

插入第一个文档时,将创建一个集合


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

正如其他人所提到的,如果不在创建时保存它,似乎就无法获得包装好的Meteor.Collection对象

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


这些对象确实有所有的find、findOne、update等方法,甚至还有一些Meteor似乎没有公开的方法,比如PauseObserver和ResumeObserver,它们看起来很有趣。但是我还没有尝试直接摆弄这个mongo LocalCollection引用,以了解它是否会相应地更新服务器集合。

您始终可以使用自己的自动集合getter

假设你有两个集合叫做“商业”和“客户”。将每个引用放入一些“collections”对象中,并注册一个Handlebar帮助器,以通过collections[“name”]访问这些“collections”

i、 e.在客户端
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}}
{{{#每个getCollection“业务”}
业务:{{{u id}
{{/每个}}
{{{#每个getCollection“客户端”}
客户:{{{u id}
{{/每个}}

瞧,妈,再也不需要通用的“列出所有记录”样板文件了

基于Shane Donelley的mongoinspector


我刚找到那个包裹:

它允许你

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

希望对您有所帮助

此功能于2016年2月添加到Meteor:

它的工作原理如下:

Meteor.connection._存储['tasks']。_getCollection()

我用它来测试使用javascript控制台的插入,如下所示:

Meteor.connection.\u存储['tasks'].\u getCollection().insert({text:'test'})

对于insert,它要求仍然安装不安全的
包,否则会收到拒绝访问的消息。

您可以使用
Mongo.Collection.get('collectionname')


请注意,插入的参数与创建集合时使用的参数相同。因此,如果您使用的是
constproducts=newmongo.Collection('Products')
,那么您应该使用
get('Products')
(小写)。

对,我知道我可以做到。但是我有很多收藏共享相同的代码,所以我想按名称引用它们。接受这个答案,因为它是基于对的阅读。在
Meteor.connection上找到的。_mongo\u livedata\u collections
@nepjua这不是正确的收藏,尝试在javascript控制台中插入,您将看到数据确实插入到客户端,但没有发送到服务器。这个答案已经过时:现在有一种方法,至少在客户端上是这样。请参阅此答案:注意:。集合仅在客户端上可用,作为LocalCollectionDriver()的一部分。因此,这种方法将为您提供发布到客户端的所有集合,但不一定是所有集合。您可以在服务器中使用此方法,而不是窗口。代码是相同的,只需将window替换为该,即可从全局命名空间获取集合对象。在全局上下文之外和严格模式下,使用
var globals=Function('returnthis')()
获取对全局对象的引用。因此,在代码中用全局变量替换window。此模式由使用。我不明白为什么要循环
window
object而不是执行:
getCollection=function(string){return(window&&window[string]&&window[string]instanceof Meteor.Collection)→window[string]:undefined;}
很好,可以指出
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
};
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