2016-05-12 3 views
1

私のプロジェクトでは、コレクション内で検索するためにコレクション名が必要なパッケージを使用しています。 Meteor 1.3に移行したばかりで、このパッケージは動作しません。コードパッケージの使用ではMeteor 1.3でコレクション名のみを使用してコレクションを取得する方法は?

のようなもの:

const search = (collection_name) => { 
    let collection = this[collection_name] 
    ... 
} 

は今コレクションはもうグローバルスコープではありません。 global[collection_name] = Collectionを私のlib/collections.jsに入れてコレクションを追加することができましたが、もっと柔軟なMeteor 1.3互換のパッケージに修正したいと思っています。

コレクション名のみを知っている場合、Mongo Collectionを入手する方法はありますか?

+0

私はあなたが 'window [collectionName]'を実行できると信じています。http://stackoverflow.com/a/20785981/2805154 –

+0

いいえ、できません。つまり、サーバー上で動作しないということです。そのため、私は 'グローバル'と言いました。 Meteor 1.3では、手動でグローバルスペースに追加する必要がありますが、これは良い解決策ではありません。それは、私のパッケージを使っているMeteor 1.3の各アプリケーション作成者がコレクションを手動でグローバルスペースに追加するよう強制します。 ES6モジュールを使用する主な考え方は、可能な限りグローバル化を避けることです。 – Jaro

答えて

1

ありがとう:

import { CollectionExtensions } from 'meteor/lai:collection-extensions' 

let registered_collections = {} 
CollectionExtensions.addExtension(function (name, options) { 
    registered_collections[name] = { 
    name: name, 
    instance: this, 
    options: options 
    }; 
}); 

export function getCollectionByName(collecion_name) { 
    return registered_collections[collecion_name].instance 
} 
0

はちょうどあなたが持っているものは何でもコレクションをユーザーに置き換え、次の技術に

Meteor.default_connection._mongo_livedata_collections.users.find({}).fetch() 

を使用してください。

https://forums.meteor.com/t/es6-global-collection-variables/22392/2?u=trajano

+0

これは、Meteor.Collectionではなく、基になるコレクションを返します。そのため、これへの挿入は正しく機能しません。私。クライアントに表示されますが、サーバーには送信されません。 – malhal

1

むしろアルキメデスによって示唆されているように、予告なく変更されることがありプライベートAPIであるように思わ何を使用するのではなく、私はあなたのコレクションを保持するグローバルオブジェクトを作成することをお勧めします。流星のドキュメント、特に状態:

Generally, you'll assign Mongo.Collection objects in your app to global variables. You can only create one Mongo.Collection object for each underlying Mongo collection.

あなたが持っている場合Collectionsグローバル、あなたは簡単にCollections[name]を経由して、問題のコレクションにアクセスすることができます。もちろん、グローバルを制限したいので、現在アプリケーション用のグローバルがある場合は、コレクションを保持するプロパティを与えてください。以下は、コレクションが1つのファイルに存在するか別個に存在するかにかかわらず、ニーズに合わせることができる共通のパターンです。私はhttps://github.com/dburles/mongo-collection-instancesを見て、その後、lai:collection-extensionsに、ここで私はそれを解決する方法です@sashko勧告へ

app = app || {}; 
app.collections = { 
    // collections here 
} 
+0

残念なことに、このソリューションはうまくいきません。なぜなら、私はそれをパッケージに入れておく必要があり、他のアプリが強制的にグローバル名空間にコレクションを入れる方法を強制したくないからです。 – Jaro

0

は、(クライアントコードで)この魔法を試してみてください:

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

詳細については、

meteor/meteor#5845(in itialしようと2015年12月)2016年2月固定

meteor/meteor#6160()

それとも、公開APIを好むし、他の答えで述べたように、他の依存性がmongo-collection-instancesを使用して気にしない場合。

+0

私は 'TypeErrorを取得しています: '_stores' of undefined'を読み取ることができません:( – Jaro

+0

これは申し訳ありませんが、これはちょうど2015年12月に追加されたメテオバージョンをチェックしてください。 – malhal

+0

It's Meteor 1.3.3.1 – Jaro

関連する問題