Не секрет, что я очень люблю метеор. Идеально для быстрой разработки и прототипов.
В этой статье хочу поделиться некоторыми аспектами работы Метеора через MongoDb с другими программами.
По умолчанию в MongoDb для идентификации используются специальные объекты ObjectId. Метеор же по умолчанию использует строчки.
Хотя информации в сети по работе в метеоре с нативными Id MongoDb не так много, мне удалось это сделать.
Первым делом у всех коллекций нужно выставить правильный idGeneration
@Price = new Meteor.Collection('price', idGeneration: 'MONGO')
Я при разработке использую iron-router и autoform практически всегда.
К сожалению с применением mongoId часть красоты уходит:
Router.route '/price/:_id', template: 'priceShow' name: 'price.show' data: -> Price.findOne(new Meteor.Collection.ObjectID @params._id) waitOn: -> [ Meteor.subscribe('price_one', new Meteor.Collection.ObjectID @params._id) ]
Передача Id в iron-router теперь делается так
Router.go 'price.show', _id: @docId.toHexString()
В шаблоне
<a href="{{pathFor 'price.show' _id=this._id.toHexString}}">
В Автоформах (autoform и simpleschema) я нужно приводить строчку к объекту
@PriceUploadSchema = new SimpleSchema company: type: Meteor.Collection.ObjectID label: 'Компания' autoform: type: 'select2' options: -> Company.find({}).map (el) -> label: el.title #id - сейчас пишется как строчка - нужно перекодировать в ObjectID в форме value: el._id.toHexString()
Но к сожалению большинство контролов не будут работать с ObjectId и его приходится переоводить в строчку, а в форме обратно в ObjectId
AutoForm.addHooks 'insertForm', formToDoc: (doc) -> if doc.company doc.company = new Meteor.Collection.ObjectID doc.company doc docToForm: (doc) -> if doc.company doc.company = doc.company.toHexString() return doc
В подписках и запросах ничего править не надо — там идет работа с ObjectID.