Не секрет, что я очень люблю метеор. Идеально для быстрой разработки и прототипов.
В этой статье хочу поделиться некоторыми аспектами работы Метеора через 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.