Получить коллекцию 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, если он существует.
Ответы
Ответ 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!