2017-12-09 8 views
0

MongooseとMongoを使用してノードサーバーにルートを作成しています。これはblogPostのコメント配列にコメントを格納します(モデルコードを投稿します)。私は、クエリを実行しようとすると、それは私に次のエラーを与える:Mongooseで配列内のオブジェクトをプッシュする方法(エラー)

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const BlogPostSchema = new Schema({ 
    content: { 
    type: String, 
    validate: { 
     validator: (content) => content.length > 5, 
     message: 'Content must contain at least 6 characters.' 
    }, 
    required: [true, 'Content must be filled in.'] 
    }, 
    rating: Number, 
    title: String, 
    user: { type: Schema.Types.ObjectId, ref: 'user' }, 
    board: {type: Schema.Types.ObjectId, ref: 'board'}, 
    comments: [{ 
    type: Schema.Types.ObjectId, 
    ref: 'comment' 
    }] 
}); 

const BlogPost = mongoose.model('blogPost', BlogPostSchema); 

module.exports = BlogPost; 

コメントモデル

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const CommentSchema = new Schema({ 
    content: { 
    type: String, 
    validate: { 
     validator: (content) => content.length > 5, 
     message: 'Content must contain at least 6 characters.' 
    }, 
    required: [true, 'Content must be filled in.'] 
    }, 
    user: { type: Schema.Types.ObjectId, ref: 'user' }, 
    rating: Number 

    // board: Board 
}); 

// UserSchema.virtual('postCount').get(function(){ 
// return this.posts.length; 
// }); 

const Comment = mongoose.model('comment', CommentSchema); 

module.exports = Comment; 

ブログ投稿のモデル: Postman error
は、これらは私のモデルとルートです

ルート

routes.put('/blogPosts/:id/comment', function(req, res) { 
    const blogPostId = req.param('id'); 
    const commentProps = req.body; 

    BlogPost.findById(req.params.id) 
     .then((blogPost) => { 
      blogPost.comments.push(commentProps); 
      blogPost.save(); 
     }) 
    .catch((error) => res.status(400).json(error)) 
}); 

ご協力いただきまして誠にありがとうございます。

+0

https://docs.mongodb.com/ecosystem/use-cases/storing-comments/そのpythonで、あなたは$プッシュを使用してのアイデアを得る – Gntem

答えて

1

問題は、あなただけにObjectIdを持っているはずの配列にコメント全体のオブジェクトを推進しているということです。

dnickless answerは、参照付きのソリューションを使用しています。つまり、ブログポストのコレクションとコメントのコレクションがあります。 blogpost文書は、objectidによるコメントを参照します。

また、参照ではなく埋め込みを使用するようにブログポストモデルを変更することもできます。つまり、コメントはブログポストドキュメントのサブドキュメントの一部になります。 herehereのどちらが良いかについての素晴らしい議論がいくつかあります。簡単な答えは、ユースケースに依存するということです。自分で使いたいものを選ぶことができます。

はここで埋め込みが行われている方法は次のとおりです。

ブログ投稿のモデル:コメントの配列は、オブジェクトIDの配列であることではなく、コメントのスキーマを使用する方法

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 
const commentSchema = require('./comment.model'); 

const BlogPostSchema = new Schema({ 
    content: { 
    type: String, 
    validate: { 
     validator: (content) => content.length > 5, 
     message: 'Content must contain at least 6 characters.' 
    }, 
    required: [true, 'Content must be filled in.'] 
    }, 
    rating: Number, 
    title: String, 
    user: { type: Schema.Types.ObjectId, ref: 'user' }, 
    board: {type: Schema.Types.ObjectId, ref: 'board'}, 
    comments: [commentSchema] 
}); 

const BlogPost = mongoose.model('blogPost', BlogPostSchema); 

module.exports = BlogPost; 

注意してください。コメントモデルは若干変更する必要があります。

コメントモデル:

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const CommentSchema = new Schema({ 
    content: { 
    type: String, 
    validate: { 
     validator: (content) => content.length > 5, 
     message: 'Content must contain at least 6 characters.' 
    }, 
    required: [true, 'Content must be filled in.'] 
    }, 
    user: { type: Schema.Types.ObjectId, ref: 'user' }, 
    rating: Number 

    // board: Board 
}); 

// UserSchema.virtual('postCount').get(function(){ 
// return this.posts.length; 
// }); 

module.exports = CommentSchema; 

const Comment = mongoose.model('comment', CommentSchema);を除去しました。スキーマはもはや登録されず、コメントには独自のコレクションがありません。登録されたモデルではなく、スキーマがエクスポートされています。

コメントを追加するための元のコードはそれ以降に有効です。コメントはブログポスト文書の一部であり、自分のコレクションには含まれません。

+0

私はサブ文書のアプローチでそれを行う場合、私はまだ得ることができますユーザーのコメントのリスト?または、blogPostはコメントにのみアクセスできますか? – Mike

+0

@Mikeユーザーのコメントの一覧を取得することはできますが、別のコレクションにコメントがある場合よりも少し難しくなります。正規化されたモデル(参照)は使いやすく、非正規化モデル(埋め込み)は、他のコレクションを参照する必要がないため、正しく実行されると高い読み取りパフォーマンスが得られます。それについての詳細はこちら[https://www.mongodb.com/blog/post/thinking-documents-part-1?jmp=docs&_ga=2.97543773.31888329.1512825673-1213879524.1495890610]です。 – MikaS

0

comment全体をcommentsアレイにプッシュしたくないだけですが、_idです。したがって、このような何か(未テスト):

// first save the comment 
Comment.create(commentProps, function(err, comment) { 
    if(err) 
    { 
     // save the world 
    } 
    else 
    { 
     BlogPost.update({ _id: req.param('id') }, { $push: { comments: comment._id } }, function(err, numberAffected, raw) { /*...*/ }); 
    }); 
関連する問題