hola, no obtengo datos de un objeto DB que almacena la identificación de otro DBS, en realidad, este es un sitio web de blog, por lo que publico comentarios y actúo como comentarios, pero hay problemas. Obtengo los mismos comentarios en todas las publicaciones, pero quiere, cada publicación debe tener su propio comentario. aquí está el esquema de publicación
const blogSchema = new mongoose.Schema({ title: String , content: String, image:{data: Buffer,contentType: String}, comment:[ { type:mongoose.Schema.Types.ObjectId, ref:'Comment' } ] });aquí está el esquema de comentarios
var commentSchema = new mongoose.Schema({ name:{ type:String, required: "this field is required" }, comment:{ type:String, required:"this filed is required" }, blog:{ type:mongoose.Schema.Types.ObjectId, ref: 'Blog' } },{ timestamps: true })enrutador node js que recibe una publicación pero no un comentario
pp.get("/post/:postname",(req,res)=>{ // const requesttitle = _.lowerCase(req.params.postname); const requesttitle = req.params.postname; Blog.findOne({_id: requesttitle} ,(err ,got)=>{ if(err){ console.log(err) }else{ const data= got.comment.find({}) console.log(data) res.render('post',{post:got }); } })})
Creo que el problema radica en tu esquema. En su blogSchema tiene referencias a muchos documentos de Comment , y en su commentSchema tiene una referencia a un solo "Blog" ( sugiero no llamarlo "blog" sino "publicar" ya que eso es lo que es ). Esta referencia duplicada no es necesaria en la mayoría de los casos.
Dado que en su configuración, un solo comentario solo puede ser un elemento secundario de una publicación específica, esta sería la referencia que elegiría. El documento de publicación en sí no necesita saber directamente qué comentarios se incluyen, ya que esa información ya se encuentra en el documento de comentarios.
Para su publicación , sugeriría el siguiente esquema:
Post Schema const postSchema = new mongoose.Schema({ title: String , content: String, image: { data: Buffer, contentType: String } });Para su comentario , sugeriría el siguiente esquema:
// Comment Schema const commentSchema = new mongoose.Schema({ name: { type: String, required: "this field is required" }, comment: { type: String, required: "this filed is required" }, post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' } });Ahora, seguro que el siguiente paso depende de que toda su parte frontal esté configurada, pero tener esquemas como este le permitiría hacer algo como:
pp.get("/post/:id", async (req,res) => { const id = req.params.id; const post = await Post.findOne({ _id: id }); const comments = await Comment.find({ post: id }); res.render('post', { post: post, comments: comments }); });la relación unidireccional significa menos trabajo si se crea o elimina un comentario.
posibilidad de obtener comentarios y/o publicaciones o ambos en una llamada api.
Requiere 2 llamadas a la base de datos si se solicitan publicaciones y comentarios.
Como alternativa al uso de Documentos referenciados, puede usar Subdocumentos .
Para su commentSchema , eso significa que no necesitará crear un Modelo separado a partir de él. Sin embargo, su postSchema debería verse así:
const commentSchema = new mongoose.Schema({ message : { type : String } }); const postSchema = new mongoose.Schema({ comments : [commentSchema] });👆 Esto incluiría de forma predeterminada todos los comentarios de la publicación si recupera la publicación de la base de datos. Sin embargo, también requeriría un código diferente para interactuar con esos comentarios (agregar, eliminar, ...) pero puede leer sobre esto en los documentos, estoy seguro.