2013-09-02 6 views
0

Я использую mongoose, и у меня есть две модели: Item и Hashtag.
Модель Hashtag должна содержать только имя, а модель элемента должна содержать список хэштегов (представленных идентификаторами).
Это то, что я сделал:отношение mongoose между моделями

var ItemSchema = new Schema({ 
    hashtags: [ { type: Schema.ObjectId, 'default': null, ref: 'Hashtag' } ], 
}); 

var HashtagSchema = new Schema({ 
    name: { type: String, 'default': '', trim: true }, 
    items: [{ type: Schema.ObjectId, ref: 'Page' }] 
}); 

Это, как я пытаюсь создать пункт:

var item = new Item({ 
     hashtags: ['a', 'b', 'c'] 
    }); 
    item.save(function (err, item) { 
     if (err) return res.json({ error: err }); 
     res.json(item); 
    }); 

К сожалению, я получаю эту ошибку:

CastError: Cast to ObjectId failed for value "a,b,c" at path "hashtags" 

Как я могу решить это?

ответ

2

Поскольку вы используете references вместо subdocuments, вам нужно создать объекты хэштегом первым:

var tagnames = ['a','b','c']; 
var hashtags = {}; //for referencing quickly by name later 
for (var h in tagnames){ 
    var tag = new Hashtag({ 
     name: tagnames[h] 
    }); 
    tag.save(function (err, item) { 
     if (err) console.log('error:',err); 
     hashtags[item.name] = item; 
    }); 
} 

После того, как вы создали Хештеги, вы можете ссылаться на них ::

var item = new Item({ 
    hashtags: [hashtags.a._id,hashtags.b._id,hashtags.c._id] 
}); 
item.save(function (err, item) { 
    if (err) return res.json({ error: err }); 
    res.json(item); 
}); 

Тогда вы можете использовать populate для автоматического превращения объектов в документы:

Item.find({}) 
    .populate('hashtags') 
    .exec(function (err, items) { 
     if (err) return handleError(err); 
     //items are populated with hashtags 
    }); 

Если вы просто делаете простую маркировку, то subdocuments может быть лучше. Они позволяют вам объявлять и сохранять дочерние документы всего за один шаг. Компромисс заключается в том, что поддокументы принадлежат исключительно их родительским документам. Они не являются ссылками, поэтому любые скопления на них должны выполняться вручную.

+0

Есть ли способ привязать хэштеги как-то к модели? Какое-то ограничение? – Naor

+0

Да, вы можете использовать [поддокументы] (http://mongoosejs.com/docs/subdocs.html), если хэштеги могут принадлежать исключительно одному элементу. –

+0

Позже я хочу показать все хэштеги. Есть ли способ добавить что-то вроде «до создания», которое создает хэштеги при необходимости и конвертирует имена в идентификаторы? – Naor

Смежные вопросы