Mongodb按相同值分组

时间:2018-10-13 20:37:24

标签: node.js mongoose

我正在使用Node和Mongoose,我真的很新。

比方说,我有以下名为userposts,route和index.ejs文件的集合。

我想在页面authors / john上显示所有John的帖子(作者为John),在页面authors / mary上显示所有Mary的帖子(作者为Mary)。

例如,当前的页面authors / mary显示集合中的所有帖子。有人可以帮我吗?

收藏:

{
"_id" : 1,
"title" : "title1",
"description" : "description1",
"author": "John",
"link": "john"
}
{
"_id" : 2,
"title" : "title2",
"description" : "description2",
"author": "John",
"link": "john"
}
{
"_id" : 3,
"title" : "title3",
"description" : "description3",
"author": "Mary",
"link": "mary"
}
{
"_id" : 4,
"title" : "title4",
"description" : "description4",
"author": "Mary",
"link": "mary"
}

路线:

router.get("/authors/:link", function(req, res){
    Userposts.find(req.params.author, function(err, allUserposts){
        if(err){
            console.log(err);
        } else {
            if(req.xhr) {
                res.json(allUserposts);
            } else {
                res.render("userposts/index", {userposts: allUserposts});
            }
        }
    });
});

index.ejs:

<% userposts.forEach(function(post){ %>
    <article>
      <h4><%= post.title %></h4>
      <p><%= post.author %></p>
      <p><%= post.description %></p>
    </article>
<% }) %>

3 个答案:

答案 0 :(得分:0)

在进行查询以获取特定于用户的帖子时,应提及作者姓名。

由于在您的路线中,因此您正在使用查询

BlogPostModel.find(authorName)

正确的语法应该是

BlogPostModel.find({ author: authorName })
  

进行MongoDB查询时,必须遵循键值syntex。

您的最终路线应该是

router.get("/authors/:link", function(req, res){
    Userposts.find({ author: req.params.author }, function(err, allUserposts){
        if(err){
            console.log(err);
        } else {
            if(req.xhr) {
                res.json(allUserposts);
            } else {
                res.render("userposts/index", {userposts: allUserposts});
            }
        }
    });
});

有关更多信息,您可以检查documentation

答案 1 :(得分:0)

我想您将“ Express”用作您的Node后端框架。

在Express路由器中,valueName以“:”开头表示“ req.params”中的值,因此,如果使用“:link”,则可以从“ req.params.link”中获取该值。您可以从http://expressjs.com/en/guide/routing.html获取更多详细信息。

如果要按作者查询,猫鼬查找操作的正确格式为:

Userposts.find({ author: req.params.link })

答案 2 :(得分:0)

谢谢您的回答。是的,我正在使用Express。应用解决方案后,它仍然无法按照我想要的方式工作。我最终在路由中获取了当前网址,并将if语句放入了我的ejs模板。现在可以了。所以我的最终路由和index.ejs看起来像这样:

router.get("/authors/:link", function(req, res){
    var currentUrl = req.originalUrl;
    Userposts.find({}, function(err, allUserposts){
        if(err){
            console.log(err);
        } else {
            if(req.xhr) {
                res.json(allUserposts);
            } else {
                res.render("userposts/index", {userposts: allUserposts, currentUrl: currentUrl});
            }
        }
    });
});

<% userposts.forEach(function(post){ %>
    <% if(post.link === currentUrl) { %>
        <article>
          <h4><%= post.title %></h4>
          <p><%= post.author %></p>
          <p><%= post.description %></p>
        </article>
    <% } %>
<% }) %>