Получить коллекцию Метеор по имени

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

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

Ответы на вопрос(11)

ть сделать это:

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

и иметь код шаблона как

  {{#each getCollection 'myCollection' }}

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

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
};
 04 мар. 2014 г., 15:15
Вы можете сделать то же самое на сервере, используяthis вместоwindow, Код такой же, просто замениwindow сthis чтобы получить объекты коллекции из глобального пространства имен.
 18 нояб. 2014 г., 20:53
Этот шаблон используетсяmeteor-autocomplete.
 04 мар. 2014 г., 15:56
Вне глобального контекста и в строгом режиме используйтеvar globals = Function('return this')(); чтобы получить ссылку на Глобальный объект. Так замениwindow сglobals в коде.
 03 авг. 2016 г., 22:35
Я не понимаю, почему вы зацикливаетесьwindow объект вместо того, чтобы делать:getCollection = function (string) { return (window && window[string] && window[string] instanceof Meteor.Collection) ? window[string] : undefined; }

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

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

Решение Вопроса

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

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

 21 июн. 2016 г., 00:59
@nepjua, который не является правильным набором, попробуйте вставить его в консоль javascript, и вы увидите, что данные вставляются в клиент, но не отправляются на сервер.
 13 февр. 2017 г., 12:47
Этот ответ устарел: теперь есть способ, по крайней мере, на клиенте. Смотрите этот ответ:stackoverflow.com/a/37938322/14637
 Trevor Burnham12 июн. 2012 г., 17:13
Принятие этого ответа, так как он основан на чтенииthe source.
 08 дек. 2014 г., 13:12
нашел его наMeteor.connection._mongo_livedata_collections

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

Это работает так:

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

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

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

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

 01 сент. 2016 г., 15:56
Можно ли это назвать со стороны сервера и клиента? Я пробовал этот код и всегда получаюTypeError: Cannot read property '_stores' of undefined на стороне сервера.

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

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

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

Эти объекты имеют все методы find, findOne, update и др. И даже те, которые Meteor, по-видимому, не раскрывают, например pauseObservers и resumeObservers, которые кажутся интересными. Но я не пробовал возиться с этой монго-ссылкой LocalCollection непосредственно, чтобы знать, будет ли она соответствующим образом обновлять коллекцию серверов.

 30 июн. 2013 г., 03:40
Примечание. .Collections доступна только на клиенте как часть LocalCollectionDriver (github.com/meteor/meteor/blob/master/packages/mongo-livedata/…). Таким образом, этот подход даст вам все коллекции, опубликованные для клиента, но не обязательно все коллекции в целом.
var bars = new Meteor.Collection("foos");

что делает collection.js, строка, которую мы используем для создания экземпляра объекта коллекции, открывает соединение с базой данных и ищет коллекцию, соответствующую названию, которое мы даем. Таким образом, в этом случае устанавливается соединение, и коллекция 'foos' привязан к объекту «Метеор.Коллекция» «бары». Увидетьcollection.js А ТАКЖЕremote_collection_driver.js в пакете Монго-Ливата.

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

A collection is created when the first document is inserted.

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

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

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

и использоватьPatterns everywhere.

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

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

 11 дек. 2014 г., 21:06
Хорошо бы указать на очевидное упущение ФП, чтоnew Mongo.Collection Вызов возвращает объект коллекции. С другой стороны, просто предоставив название коллекцииMeteor.subscribe() может не работать, если функция публикации использует другое имя. УвидетьUnderstanding Meteor publish/subscribe для деталей.

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

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

 21 сент. 2016 г., 14:17
@Jankapunkt уверенstackoverflow.com/a/37938322/259521
 21 сент. 2016 г., 13:57
@malhal У вас есть ссылка, которая показывает, как это сделать в текущей версии?
 21 июн. 2016 г., 10:06
Обратите внимание, что этот пакет больше не нужен, потому что теперь получение существующих коллекций является встроенной функцией.

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

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

 Trevor Burnham11 июн. 2012 г., 23:59
Хорошо, я знаю, что могу это сделать. Но у меня есть большое количество коллекций, которые используют один и тот же код, поэтому я бы хотел сослаться на них по имени.

Допустим, у вас есть несколько коллекций под названием «Бизнес». и "Клиенты". Поместите ссылку каждый в несколько «коллекций» Объект и зарегистрировать помощник Handlebars для доступа к этим "коллекциям" по коллекциям [& quot; имя & quot;].

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

Смотри, ма, не более универсальный & quot; список всех записей & quot; Образец JS требуется!

Ваш ответ на вопрос