2013-09-02 15 views
0

몽구스를 사용하고 있는데 두 가지 모델이 있습니다 : 항목과 해시 태그.
해시 태그 모델은 이름 만 포함해야하며 항목 모델에는 해시 태그 (ids로 표시) 목록이 포함되어야합니다. 내가 어떻게몽구스 모델 간의 관계

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

수 있습니다

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

불행하게도 나는이 오류가 발생합니다 :

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' }] 
}); 

이 나는 ​​아이템을 만들려고하는 방법이다 :
이 내가 한 일이다 이거 해결해?

답변

2

대신 subdocumentsreferences을 사용하고 있기 때문에, 먼저 해시 태그 객체를 생성해야합니다 당신은 해시 태그를 생성하면

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을 사용하면 개체 ID를 문서로 자동 전환 할 수 있습니다.

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

단순한 태그 지정을 수행하는 경우 subdocuments이 더 적합 할 수 있습니다. 이를 통해 하위 문서를 한 번에 선언하고 저장할 수 있습니다. 단점은 하위 문서가 상위 문서에만 속한 것입니다. 이들은 참조가 아니므로 이들에 대한 집계는 수동으로 수행해야합니다.

+0

해시 태그를 어떻게 든 모델에 삽입 할 수있는 방법이 있습니까? 어떤 종류의 제약? – Naor

+0

예, 해시 태그가 하나의 항목에만 속할 수있는 경우 [subdocuments] (http://mongoosejs.com/docs/subdocs.html)를 사용할 수 있습니다. –

+0

나중에 모든 해시 태그를 표시 할 수 있기를 원합니다. 필요한 경우 해시 태그를 생성하고 이름을 ids로 변환하는 "before create"와 같은 것을 추가 할 수있는 방법이 있습니까? – Naor