2016-05-12 2 views
1

Dans mon projet, j'utilise un paquet qui a besoin du nom de collection pour effectuer une recherche dans la collection. Je viens de migrer dans Meteor 1.3 et maintenant ce paquet ne fonctionne pas.Comment obtenir Collection en utilisant uniquement le nom de la collection dans Meteor 1.3?

Dans le package de code utiliser quelque chose comme:

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

Maintenant collection est pas portée globale plus. Je pourrais y ajouter ma collection en faisant global[collection_name] = Collection dans mon lib/collections.js, mais j'aimerais mieux réparer le paquet pour être plus flexible et compatible avec Meteor 1.3.

Est-il possible d'obtenir Mongo Collection si vous ne connaissez que le nom de collection?

+0

Je crois que vous pouvez faire 'window [collectionName]', voir http://stackoverflow.com/a/20785981/2805154 –

+0

Non, vous ne pouvez pas. Je veux dire que ça ne marchera pas sur le serveur, c'est pourquoi j'ai mentionné 'global'. Dans Meteor 1.3, vous devez ajouter manuellement dans l'espace global, ce qui n'est pas une bonne solution. Cela forcerait chaque créateur d'application Meteor 1.3 (qui utilise mon paquetage) à ajouter manuellement leurs collections dans l'espace global. Et l'idée principale d'utiliser des modules ES6 est d'éviter autant que possible les globals. – Jaro

Répondre

1

Merci à @sashko recommandation je regardais https://github.com/dburles/mongo-collection-instances puis à lai:collection-extensions et voici comment je l'ai résolu:

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

Utilisez la technique suivante

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

Il suffit de remplacer les utilisateurs avec tout ce que vous avez collection.

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

+0

Cela renvoie la collection sous-jacente et non la collection Meteor. Par conséquent, une insertion dans celle-ci ne fonctionne pas correctement. C'est à dire.Il apparaît sur le client mais n'est pas envoyé au serveur. – malhal

1

Plutôt que d'utiliser ce qui semble être un api privé qui peut changer sans préavis comme suggéré par Archimedes, je recommande de créer un objet global pour tenir vos collections. Les docs de météores spécifiquement état:

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.

Donc, si vous avez un Collections global, vous pouvez facilement accéder à la collection en question par Collections[name]. Bien sûr, vous voulez limiter vos globals, donc si vous avez actuellement un global pour votre application, donnez-lui simplement une propriété pour contenir vos collections. Ce qui suit est un modèle commun que vous pouvez adapter à vos besoins, que vos collections se trouvent dans un seul fichier ou séparément.

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

Malheureusement, cette solution ne fonctionnerait pas, parce que j'en ai besoin dans un paquet et que je ne veux pas forcer d'autres applications à utiliser l'un ou l'autre style pour placer des collections dans un espace de nom global. – Jaro

0

Essayez cette magie (dans le code client):

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

Pour plus d'informations checkout:

meteor/meteor#5845 (dans itial tentative déc 2015)

meteor/meteor#6160 (fixe février 2016)

Ou si vous préférez API public et ne pas utiliser une autre dépendance dérange pas mongo-collection-instances comme mentionné dans l'autre réponse.

+0

Je reçois 'TypeError: Impossible de lire la propriété '_stores' de undefined' pour ceci :( – Jaro

+0

Désolé, vérifiez votre version de Meteor car elle vient juste d'être ajoutée en décembre 2015, mais elle a dû être corrigée en février 2016, je 'll met à jour la réponse avec des liens – malhal

+0

C'est Meteor 1.3.3.1 – Jaro