web-dev-qa-db-fra.com

Meteor - collection.find () renvoie toujours tous les champs

Ran dans ce (problème légèrement ennuyeux) J'essaie de rechercher tous les enregistrements dans une collection et de ne pas montrer (ou montrer) un champ spécifique (score). Ceci est juste un exemple et ne reflète pas mon code actuel, mais le problème est toujours reproductible. Les champs que j'exclus sont très grands et j'essaye simplement de générer un menu des enregistrements disponibles.

Des commandes comme

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

Renvoyez toujours chaque champ, au lieu de déclencher l'exclusion/inclusion dans mongodb. Suis-je inquiet pour rien, car le modèle peut potentiellement contrôler quelles données sont rendues en html? On a toujours l'impression que les données sont transférées du côté client malgré tout; et apparaît dans la console.

51
redcap3000

votre syntaxe est un peu fausse, elle devrait être

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

ou

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

votre modèle contrôle en effet quelles données sont affichées, mais il existe de nombreux scénarios où la limitation des champs est logique - la confidentialité des données ou l'efficacité (certains champs de tous les enregistrements, tous les champs de l'enregistrement "actuel") sont deux courants

vous ne l'avez pas mentionné, mais c'est généralement dans une fonction de publication - voir http://docs.meteor.com/#meteor_publish - le modificateur fields est également disponible sur le client, mais là, il ne limite pas les données envoyées au client, juste au modèle - la réduction/sélection de champs côté serveur présente des avantages différents

-

vérifiez que vous avez également supprimé le package autopublish, mais vous devriez voir un avertissement si vous l'avez activé et écrire vos propres fonctions de publication, c'est là que vous utiliseriez le plus souvent fields

97
nate-strauser

Tout d'abord, si vous souhaitez contrôler certains champs dans Collection.find() ,, vous pouvez essayer de le faire de cette façon:

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

mais cela ne fonctionnait que sur le serveur.

Ou essayez ceci:

Sur le serveur:

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

Sur le client:

Meteor.subscribe("myCollection");

puis exécutez meteor remove autopublish.

Deuxièmement, si vous voulez obtenir Array of Collection.find (), essayez de le faire: Collection.find (). Fetch ();

10
L.T