名前

2012-06-11 16 views
21
によって流星のコレクションを取得します

は私が書くと仮定します。名前

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]を使用することができます知っているが、私は1つが存在する場合は、既存のAPIを使用することを好むだろう。

答えて

3

私はcollection.jsのソースから見る限り、すでにサーバー上で既に初期化されていれば、既存のコレクションを名前で取得する方法はありません。おそらくその機能を追加するのは難しくありません。

メトーをフォークしてパッチを提出したり、スマートパッケージを作成して共有したりしないでください。同じ機能を好きな人がいると確信しています。あなただけ

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

を行うと、どこにでもPatternsを使用することができますので、彼らは、戻り値を持っていることを

+0

この回答を受け入れるのは、[ソース](https://github.com/meteor/meteor/blob/master/packages/mongo-livedata/collection.js)の情報に基づいているためです。 –

+7

は、正しいコレクションではありません 'Meteor.connection._mongo_livedata_collections' – nepjua

+0

@nepjuaにそれを見つけたJavaScriptコンソールでそれを挿入してみてください、あなたはデータをクライアントに挿入しそれに送信されません表示されますサーバ。 – malhal

0

よりもむしろ見て、私は行ってきた:

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

またはおそらく別のオブジェクトの中に置くと。私は実際にコレクションコレクションオブジェクトを作成していません。

+0

私はそれを行うことができます。しかし、私は同じコードを共有するコレクションがたくさんあるので、それらを名前で参照したいと思います。 –

0

は注意してください。

サーバーの更新プログラムを購読する必要がある場合は、"patterns"Meteor.subscribe()を入力してください。


複数のコレクションで同じコードを使用している場合は、ソフトウェアエンジニアリングの観点から何か問題がある可能性が高くなります。 typeフィールド(またはドキュメントを区別する別のコレクション)を持つ単一のコレクションを使用し、複数のコレクションを使用する代わりにそのコレクションを使用するのはなぜですか? collection.jsが何をするかによって判断

+1

OPからの明白な省略であると思われることを指摘しておくと、 'new Mongo.Collection'呼び出しはコレクションオブジェクトを返します。一方、パブリッシュ関数が別の名前を使用する場合、コレクション名を単に 'Meteor.subscribe()'に渡すことはできません。詳細については、[Understanding Meteor publish/subscribe](http://stackoverflow.com/a/21853298/1269037)を参照してください。 –

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

、我々はコレクションオブジェクトをインスタンス化するために使用するラインは、データベースへの接続を開き、私たちが付けた名前に一致するコレクションを探します。この場合、接続が行われ、コレクション 'foos'はMeteor.Collectionオブジェクト 'bars'にバインドされます。 mongo-livedataパッケージ内のcollection.jsおよびremote_collection_driver.jsを参照してください。

MongoDBと同じように、明示的にコレクションを作成する必要はありません。 MongoDBのドキュメントで述べたように: - 私は完全にあなたが意図されているものと誤解していない限りそう

A collection is created when the first document is inserted.

、私は何を後にしていることはすでに持っているものだと思います。

0

ラッピングされたMeteor.Collectionオブジェクトに、作成時に保存せずに取得する方法が他にもあるようです。

しかし、少なくとも作成されたすべてのコレクションをリストし、実際には対応するMongo LocalCollectionオブジェクトにアクセスする方法があります。彼らはどんなMeteor Collectionオブジェクトからでも利用できるので、それを一般的に保つために、これのためだけにダミーのコレクションを作ることができます。 (CoffeeScriptの)などのメソッドを使用します。

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

これらのオブジェクトは、面白いように見えるpauseObserversとresumeObserversのように、さらにいくつかの流星を公開していないようだということ、findOneをすべて検索を持つらの方法を更新し、そして行います。しかし、私はこのmongo LocalCollectionのリファレンスを参考にして、サーバーコレクションをそれに応じて更新するように直接試してみませんでした。

+2

注:.collectionsは、LocalCollectionDriver(https://github.com/meteor/meteor/blob/master/packages/mongo-livedata/local_collection_driver.js)の一部として、クライアントでのみ使用できます。 この方法では、すべてのコレクションをクライアントに公開することができますが、コレクション全体を必ずしもすべてにする必要はありません。 – AlexeyMK

-2

誰でも解決策を考え出してください。

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

と私は流星テンプレートヘルパー/ wがそれをやって、いくつかの冗長性に気づいてきたように、本当に有用であろう

{{#each getCollection 'myCollection' }} 

のようなテンプレートコードを持っている:これを行うことができるのは素晴らしいことです。 ..

-2

あなた自身の自動収集ゲッターはいつでも回転できます。

"ビジネス"と "クライアント"という2つのコレクションがあるとします。いくつかの "コレクション"オブジェクトにそれぞれ参照を入れ、Collection ["name"]によってそれらのコレクションにアクセスするためのHandlebarsヘルパーを登録します。

すなわち、クライアント側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必須!私はちょうどそのパッケージを見つけたシェーン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 
}; 
15

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

***窓***の代わりにこの***を使用して、同じことをサーバーで行うことができます。コードは同じですが、グローバルな名前空間からコレクションオブジェクトを取得するには***ウィンドウ***を***に置き換えてください。 – Alberto

+2

グローバルコンテキストの外で厳密なモードで、グローバルオブジェクトへの参照を取得するには、 'var globals = Function( 'return this')();'を使用します。したがって、***ウィンドウ***を***のグローバル変数***に置き換えてください。 – Alberto

+0

このパターンは、[meteor-autocomplete](https://github.com/mizzao/meteor-autocomplete/blob/master/autocomplete-server.coffee#L8)で使用されています。 –

11

に基づいて

+2

現在、既存のコレクションを取得する機能が組み込まれているため、このパッケージは不要です。 – malhal

+0

@malhal現在のバージョンでこれを行う方法を示すリンクがありますか? – Jankapunkt

+0

@Jankapunkt確かにhttp://stackoverflow.com/a/37938322/259521 – malhal

6

を助けることを願っていますこの機能はMに追加されましたeteor 2016年2月に:

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

とJavaScriptコンソール使用して挿入をテストするために、次のように私はそれを使用していた:"Provide a way to access collections from stores on the client"

それはこのように動作するために

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

を挿入する必要があります。insecureパッケージがまだインストールされていないと、アクセス拒否メッセージが表示されます。

+1

これをサーバ側とクライアント側から呼び出すことは可能ですか?私はこのコードを試して、常に** TypeErrorを取得:サーバー側で未定義**のプロパティ '_stores'を読み取ることができません。 – grahan

1

https://github.com/dburles/mongo-collection-instancesを使えば、あなたが挿入しているパラメータは、コレクションを作成する際に使用するのと同じものであるとMongo.Collection.get('collectionname')

注意を使用することができます。したがって、const Products = new Mongo.Collection('products')を使用している場合は、get('products')(小文字)を使用してください。