循环遍历具有子数组的嵌入式文档并将它们显示在 EJS 文档上

Posted

技术标签:

【中文标题】循环遍历具有子数组的嵌入式文档并将它们显示在 EJS 文档上【英文标题】:Looping through an embedded document that has sub arrays and display them on EJS document 【发布时间】:2015-12-09 22:31:44 【问题描述】:

我的目标是我试图循环访问一个嵌入式文档以显示他们相同 id 帖子的 cmets。

这是我在 node.js 服务器中的 Schema 结构:

var postSchema = new mongoose.Schema(
    name: String,
    post: String,
    comment: [
        
        commentname: String,
        comment: String
        
    ]
);

这是我收到将 cmets 添加到具有当前 ID 的帖子的方式:

app.post('/comment/:id', function(req, res) 
    console.log(req.body);
    var comments = 
        commentname: req.body.name,
        comment: req.body.comment
    
    Posts.update(_id: req.params.id, $push: comment: comments, safe: true, upsert: true, function(err, comments)

        if (err) 
            console.log("Issue with adding a comment");
            res.redirect('/');
         else 
            console.log("Success Adding Comments");
            res.redirect('/');
        
    );
);

这就是我在主页上显示所有帖子和 cmets 的方式:

app.get('/', function(req, res) 
    Posts.find(, function(err, posts) 
        if (err) 
            console.log('Issue receiving posts');
         else 
            console.log('Receiving Posts Success');
            res.render("index", posts: posts);
        
    );
);

这是我的 EJS 文件的样子:

    <% for (index in posts)  %>
    <div class="posts">
        <h3>Name: <%= posts[index].name %></h3>
        <h3>Message: <%= posts[index].post %></h3>
        <div class="comment">
            <h3 class="text-underline"><i>Post a Comment: </i></h3>
            <div class="comments">
                <p>Name: Jimmy</p>
                <p>Comment: I agree, the codingdojo is pretty swell</p>
            </div>
            <div class="comments">
                <p>Name: Bob</p>
                <p>Comment: Why aren't you guys working?</p>
            </div>
            <form action="/comment/<%= posts[index]._id %>" method="post">
                <label for="name" style="display: block">Name: </label>
                <input type="text" name="name" id="name">
                <br />
                <label for="comment">Message: </label>
                <textarea name="comment" id="comment" class="form-control"></textarea>
                <button class="btn btn-info pull-right">Post Comment</button>
            </form>
        </div>
    </div>
    <%  %>

我无法弄清楚如何在帖子中添加嵌套循环并显示属于该帖子的特定评论。

但是,我可以通过以下方式访问属于帖子的名称和评论:

<%= console.log(posts[0].comment[0].commentname) %>
<%= console.log(posts[0].comment[0].comment) %>

我对如何在帖子中添加嵌套循环以仅显示属于该特定帖子的评论和名称感到非常困惑。我目前有一些关于 cmets 应该去哪里的虚拟文本,例如。

* 更新 *

这是我目前所拥有的:

    <% for (index in posts)  %>
    <div class="posts">
        <h3>Name: <%= posts[index].name %></h3>
        <h3>Message: <%= posts[index].post %></h3>
        <div class="comment">
            <h3 class="text-underline"><i>Post a Comment: </i></h3>
        <% if (posts[index].comment != 'undefined')  %>
        <%      for (commentindex in posts[index].comment)  %>
            <div class="comments">
                <p>Name: <%= posts[index].comment[commentindex].commentname %></p>
                <p>Comment: <%= posts[index].comment[commentindex].comment %></p>
            </div>
        <%  %>
        <%  %>

这是在正确的帖子上打印出 cmets,这正是我想要的,但是现在它不知从哪里打印出很多未定义的内容。例如,这是页面上的内容:

姓名:维多利亚 消息:午餐什么时候到?

发表评论:

姓名:戴安娜

评论:嘿,最近怎么样!?

姓名:罗比

评论:闭嘴!

姓名:弗兰基

评论:嘿,我需要和你谈谈!

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

评论:未定义

名称:未定义

【问题讨论】:

【参考方案1】:
<% for (index in posts)  %>
<div class="posts">
    <h3>Name: <%= posts[index].name %></h3>
    <h3>Message: <%= posts[index].post %></h3>
    <div class="comment">
        <h3 class="text-underline"><i>Post a Comment: </i></h3>
<% for (commentindex in posts[index].comment)  %>
        <div class="comments">
            <p>Name: <%= posts[index].comment[commentindex].commentname %></p>
            <p>Comment: <%= posts[index].comment[commentindex].comment %></p>
        </div>
<%  %>
        <form action="/comment/<%= posts[index]._id %>" method="post">
            <label for="name" style="display: block">Name: </label>
            <input type="text" name="name" id="name">
            <br />
            <label for="comment">Message: </label>
            <textarea name="comment" id="comment" class="form-control"></textarea>
            <button class="btn btn-info pull-right">Post Comment</button>
        </form>
    </div>
</div>
<%  %>

在这里您可以访问属于帖子的名称和评论,因为循环位于帖子循环内。

【讨论】:

这行得通,但是现在,它正在打印 cmets 应该正确的位置,但是现在它打印出很多未定义的内容。 它们是您数据库中的数据,因此您需要在添加评论之前进行一些验证(检查它们是否不为空) 我没有在我的数据库中添加任何日期,只是名称和 cmets。 或者你可以这样做:&lt;% for (commentindex in posts[index].comment) %&gt;&lt;% if (posts[index].comment != 'undefined') %&gt; 是的,我已经做到了,它仍然吐出 undefined :(

以上是关于循环遍历具有子数组的嵌入式文档并将它们显示在 EJS 文档上的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历两个字符串数组并将它们设置为对象属性

连续循环遍历数组以创建水平股票行情

遍历具有属性的对象数组并将它们打印到 DOM

循环遍历一个大数组并将值加在一起 ​​C#

循环遍历对象数组,并将它们转换为 UL 中的 LI 项 [重复]

如何创建点,显示它们并将它们存储在某种数组中