Подтвердить что ты не робот

Получить коллекцию Meteor по названию

Предположим, что я пишу:

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, если он существует.

4b9b3361

Ответ 1

Насколько я могу видеть в источнике collection.js, в настоящее время в api нет способа получить существующую коллекцию по имени, как только она уже была инициализирована на сервере. Возможно, было бы не сложно добавить эту функцию.

Итак, почему бы не fork Meteor и не опубликовать патч или создать смарт-пакет и не поделиться им, я уверен, что есть другие, кто хотел бы иметь такую ​​же функцию.

Ответ 2

Основано на майонезе Шейне Донелли 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
};

Ответ 3

Я только что нашел этот пакет: 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

Надеюсь, что это поможет

Ответ 4

Эта функция была добавлена ​​в Meteor в феврале 2016 года: "Предоставить доступ к коллекциям из магазинов на клиенте"

Он работает следующим образом:

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

И я использовал его для тестирования вставок с помощью консоли javascript:

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

Для вставки требуется, чтобы пакет insecure все еще был установлен, иначе был получен отказ в доступе.

Ответ 5

С https://github.com/dburles/mongo-collection-instances вы можете использовать Mongo.Collection.get('collectionname')

Обратите внимание, что параметр, который вы вставляете, тот же, который вы используете при создании коллекции. Поэтому, если вы используете const Products = new Mongo.Collection('products'), тогда вы должны использовать get('products') (строчный).

Ответ 6

Вместо того, чтобы смотреть, я только что делал:

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

или, возможно, поместить его в другой объект. Я действительно не делал объект коллекции Collections.

Ответ 7

Обратите внимание, что они имеют возвращаемое значение, поэтому вы можете просто сделать

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

и используйте Patterns всюду.

И когда вам нужно подписаться на обновления сервера, откройте "patterns" до Meteor.subscribe().


Если у вас есть один и тот же код для нескольких коллекций, вероятность того, что вы делаете что-то не так с точки зрения разработки программного обеспечения; почему бы не использовать одну коллекцию с полем type (или что-то еще, что отличает документы) и использовать это вместо использования нескольких коллекций?

Ответ 8

Кажется, что нет способа попасть на обернутый объект Meteor.Collection, не сохраняя его во время создания, как упомянули другие.

Но есть хотя бы способ перечислить все созданные коллекции и фактически получить доступ к соответствующему объекту Mongo LocalCollection. Они доступны из любого объекта Meteor Collection, поэтому, чтобы сохранить его универсальным, вы можете создать фиктивную коллекцию только для этого. Используйте метод как таковой (CoffeeScript):

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

В этих объектах есть все методы find, findOne, update et al и даже некоторые, которые, как представляется, не показывают Meteor, например pauseObservers и resumeObservers, которые кажутся интересными. Но я не пробовал использовать эту ссылку Mongo LocalCollection непосредственно, чтобы знать, что она соответствующим образом обновит коллекцию сервера.

Ответ 9

var bars = new Meteor.Collection("foos");

Судя по тому, что делает collection.js, линия, которую мы используем для создания экземпляра объекта коллекции, открывает соединение с базой данных и ищет коллекцию, соответствующую имени, которое мы даем. Таким образом, в этом случае происходит соединение, и коллекция "foos" привязана к "барам" объекта Meteor.Collection. См. collection.js И remote_collection_driver.js в пакете mongo-livingata.

Как и в случае с MongoDB, в то время как вы можете, вам не нужно явно создавать коллекции. Как указано в документации MongoDB:

Коллекция создается при вставке первого документа.

Итак, я думаю, что вы за то, что у вас уже есть, - если я полностью не понял, что вы намерены.

Ответ 10

Кто-нибудь придумал решение для этого? Было бы здорово это сделать:

Handlebars.registerHelper('getCollection', function(e) {
 return Meteor.collection(e) // or something like this
});

и имеют код шаблона, например

  {{#each getCollection 'myCollection' }}

Это было бы очень полезно, поскольку я заметил некоторые сокращения, выполняющие его с помощью помощников шаблонов метеоров...

Ответ 11

Вы всегда можете свернуть свой собственный автоматический сборщик.

Скажем, у вас есть пара коллекций под названием "Бизнес" и "Клиенты". Поместите ссылку в какой-нибудь объект "коллекции" и зарегистрируйте помощник Handlebars для доступа к этим "коллекциям" по коллекциям [ "name" ].

то есть. поставьте что-то вроде этого на стороне клиента 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}}

Посмотрите ma, нет более общих "списков всех записей", необходимых для шаблона js!