Hola, estoy tratando de obtener todos mis blogs de DB y cambiar el nombre del autor de otra colección de la base de datos y luego renderizarlos en un archivo ejs, sin embargo, la página se muestra antes de que se llene la matriz.
app.get('/', async (req, res) => { let blogList = new Array(); await Blog.find({}, function (err, foundBlog) { console.log(foundBlog); if (err) { console.log(err); } else { foundBlog.forEach(async (blog) => { await Author.findById(blog.author, async (err, author) => { if (err) { console.log(err); } else { blog.author = author.name; console.log('this is the blogs' + blog); blogList.push(blog); console.log('array length 1 is ' + blogList.length); } }); }); console.log('array length 2 is ' + blogList.length); console.log(blogList); res.render('home', { blogs: blogList }); } }); });Utilice la referencia del autor en el blog. En otras palabras hacer una relación de blog con autor. Y luego su backend debería ser el siguiente:
app.get('/', async (req, res) => { const blogs=await Blog.find({}).populate('author').exec(); // field name author is being populated. res.render('home', { blogs }); } ); const BlogSchema=new mongoose.Schema({ ... rest of fields, author:{ type:ObjectId, ref:"Author" // here it is model name } });Con este código ahora todo su objeto de autor estará incrustado en cada blog como:
blog={ name:"", author:{ name:"Abc", } }Y puede obtener fácilmente los detalles del autor accediendo a blog.author.name.
para su consulta, puede explorar poblar en su Mongo Schema en la colección.
const BlogSchema = new mongoose.Schema({ author:{ type:ObjectId, ref:"Author" //here it is model name } }) const Blog = mongoose.model("Blog", BlogSchema ) const AutherSchema = new mongoose.Schema({ _id:{ type:ObjectId } }) const Auther = mongoose.model("Auther", AutherSchema) app.get('/', async (req, res) => { const blogs = await Blog.find({}).populate('author').exec(); // field name author is being populated. res.send(blogs) } )