suku
suku

Reputation: 10937

Mongoose- How to use discriminators in subdocument

I want the output to be like this

var FeedSchema = new Schema({
   timestamp : {type : String, required : true},
   feed_type_code : {type : Number, required : true},
   gender : {type : String, required : true},
   feed_item : Article || Tip || etc.
}

Hence, I understand I have to use discriminators. I followed the following SO answer

Here is what I did:

var feed_type = {discriminatorKey : 'feed_item'};

var FeedSchema = new Schema({
   timestamp : {type : String, required : true},
   feed_type_code : {type : Number, required : true},
   gender : {type : String, required : true}
}, feed_type);

var TipSchema = new Schema({
   tip : {type : String, required : true},
   subtip : {type : String, required : true},
   display_count : {type : Number},
   likes : {type : Number}
}, feed_type);

var ArticleSchema = new Schema({
   title : {type : String, required : true},
   english_title : {type : String, required : true},
   image_url : {type : String, required : true},
   article_text : {type : String, required : true},
   english_article_text : {type : String},
   author : {type : String},
   english_author : {type : String}
}, feed_type);

Here is how I am saving the document:

var article = new Article({
    title : req.body.title,
    english_title : req.body.english_title,
    image_url : req.body.image_url,
    article_text : req.body.article_text,
    english_article_text : req.body.english_article_text,
    author : req.body.author,
    english_author : req.body.english_author
});

var feed = new Feed({
    gender : req.body.gender,
    timestamp : moment().valueOf(), 
    feed_type_code : 9002,
    feed_item : article 
});

feed.save(function(err, doc){
    if(err){
        res.json({success : -1});
        return;
    }
    res.json({success : 1, feed : doc});
});

I am not getting the article output for this:

{

"success": 1,
"feed": {
    "__v": 0,
    "gender": "female",
    "timestamp": "1481460218959",
    "feed_type_code": 9002,
    "_id": "584d49faa6ff3a23bc868ab3"
}
}

I am new to Nodejs. I would appreciate if you can point out the error.

Upvotes: 1

Views: 899

Answers (1)

suku
suku

Reputation: 10937

in the model file add these lines

var Feed = mongoose.model('Feed', FeedSchema, 'feed');
var Article = Feed.discriminator('Article', ArticleSchema);
var Tip = Feed.discriminator('Tip', TipSchema);

module.exports = {
   Feed : Feed,
   Article : Article,
   Tip : Tip
} 

This is how you save the document. You don't need to create a separate Feed object.

var article = new Article({
    gender : req.body.gender,
    timestamp : moment().valueOf(), 
    feed_type_code : 9002,
    title : req.body.title,
    english_title : req.body.english_title,
    image_url : req.body.image_url,
    article_text : req.body.article_text,
    english_article_text : req.body.english_article_text,
    author : req.body.author,
    english_author : req.body.english_author
});

article.save(function(err, doc){
    if(err){
        console.log(err);
        res.json({success : -1});
        return;
    }
    res.json({success : 1, feed : doc});
});

Upvotes: 1

Related Questions