web-dev-qa-db-ja.com

Meteor-collection.find()は常にすべてのフィールドを返します

これに走った(少し厄介な問題)私はコレクション内のすべてのレコードを検索しようとしており、特定のフィールド(スコア)を表示(または表示)していません。これは単なる例であり、実際のコードを反映していませんが、問題は常に再現可能です。除外するフィールドは非常に大きく、使用可能なレコードのメニューを生成しようとしているだけです。

のようなコマンド

    players.find({},{score:1})
    players.find({},{score:0})

Mongodbでexclude/includeをトリガーするのではなく、常にすべてのフィールドを返します。テンプレートはどのデータをhtmlにレンダリングするかを潜在的に制御できるため、何も心配しませんか?それでも、データはクライアント側に転送されるように感じます。コンソールに表示されます。

51
redcap3000

あなたの構文は少しずれているはずです

CollectionName.find({}, {fields: {'onlyThisField':1}});

または

CollectionName.find({}, {fields: {'everythingButThisField':0}});

テンプレートは実際に表示するデータを制御しますが、フィールド制限が意味をなすシナリオはまだ多くあります-データのプライバシーまたは効率(すべてのレコードの一部のフィールド、「現在の」レコードのすべてのフィールド)は2つの一般的なものです

あなたはそれを言及しませんでしたが、これは通常公開関数内です- http://docs.meteor.com/#meteor_publish を参照-fields修飾子もクライアントで利用可能です、ただし、クライアントに送信されるデータはテンプレートだけに制限されません-サーバー側のフィールド削減/選択にはさまざまな利点があります

-

autopublishパッケージも削除したことを再確認してください。ただし、アクティブな場合は警告が表示され、fieldsを最もよく使用する独自の発行関数を記述します。

97
nate-strauser

最初に、Collection.find()のいくつかのフィールドを制御したい場合は、次の方法で実行できます。

CollectionName.find({}, {fields: {field:1}});

しかし、それはサーバー上でのみ機能していました。

またはこれを試してください:

サーバー上:

Meteor.publish("myCollection", function () {
    return SvseTree.find({},{fields: {field:1}});
});

クライアントで:

Meteor.subscribe("myCollection");

次にmeteor remove autopublishを実行します。

第二に、Collection.find()の配列を取得したい場合は、それを試してください:Collection.find()。fetch();

10
L.T