24

私が書くとしましょう:

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 があればそれを使用したいと思います。

4

10 に答える 10

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
};
于 2013-12-26T13:48:53.863 に答える
12

この機能は 2016 年 2 月に Meteor に追加されました: 「クライアント上のストアからコレクションにアクセスする方法を提供する」

それはこのように動作します:

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

そして、JavaScriptコンソールを使用して挿入をテストするために、次のように使用していました。

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

挿入するには、insecureパッケージがまだインストールされている必要があり、それ以外の場合はアクセス拒否メッセージが表示されました。

于 2016-06-21T07:40:55.237 に答える
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

それが役立つことを願っています

于 2014-11-17T10:20:31.833 に答える
3

ソースで確認できる限りcollection.js、サーバーで既に初期化されている場合、API で既存のコレクションを名前で取得する方法は現在ありません。その機能を追加することはおそらく難しくないでしょう。

ですから、Meteor をフォークしてパッチを提出したり、スマート パッケージを作成して共有したりしないでください。同じ機能を望んでいる人が他にもいるはずです。

于 2012-06-11T22:57:02.973 に答える
1

戻り値があることに注意してください。

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

Patterns どこでも使用できます。

また、サーバーの更新を購読する必要がある場合は、 に提供"patterns"してMeteor.subscribe()ください。


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

于 2012-06-12T03:36:04.570 に答える
0

他の人が言及しているように、作成時に保存せずにラップされたMeteor.Collectionオブジェクトを取得する方法はないようです。

ただし、少なくとも、作成されたすべてのコレクションを一覧表示し、対応するMongoLocalCollectionオブジェクトに実際にアクセスする方法があります。これらは任意のMeteorCollectionオブジェクトから利用できるため、一般性を保つために、このためだけにダミーコレクションを作成できます。そのようなメソッドを使用します(CoffeeScript):

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

これらのオブジェクトには、すべてのfind、findOne、update et alメソッドがあり、PauseObserversやresumeObserversのように、Meteorが公開していないように見えるものもあります。しかし、サーバーコレクションがそれに応じて更新されるかどうかを知るために、このmongoLocalCollection参照を直接いじってみたことはありません。

于 2012-06-24T05:11:28.267 に答える
0

見るのではなく、私はただやっています:

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

または、別のオブジェクトの中に入れることもできます。Collections コレクション オブジェクトを実際に作成したことはありません。

于 2012-06-11T21:28:13.683 に答える
-1
var bars = new Meteor.Collection("foos");

collection.jsの機能から判断すると、コレクションオブジェクトをインスタンス化するために使用する行は、データベースへの接続を開き、指定した名前に一致するコレクションを探します。したがって、この場合、接続が確立され、コレクション'foos'がMeteor.Collectionオブジェクト'bars'にバインドされます。mongo-livedataパッケージ内のcollection.jsANDを参照してください。remote_collection_driver.js

MongoDBの場合と同様に、可能ですが、コレクションを明示的に作成する必要はありません。MongoDBのドキュメントに記載されているように:

コレクションは、最初のドキュメントが挿入されたときに作成されます。

ですから、あなたが求めているのは、あなたがすでに持っているものだと思います。私があなたの意図を完全に誤解していない限り。

于 2012-06-12T13:58:30.930 に答える
-2

いつでも独自の自動コレクション ゲッターを作成できます。

「Businesses」と「Clients」というコレクションがいくつかあるとします。いくつかの「コレクション」オブジェクトにそれぞれ参照を入れ、コレクション[「名前」]によってそれらの「コレクション」にアクセスする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}}

ほら、もう一般的な「すべてのレコードをリストする」ボイラープレート js は必要ありません。

于 2013-12-18T15:06:12.477 に答える