如何显示由嵌套引用链接的属性值

时间:2017-10-01 14:39:09

标签: node.js mongodb express mongoose

不确定我想做的事情是否可行。

我想显示' name'的值。通过从引用引用用户架构(模型)的注释架构(模型)的文章文档中检索数据,在我的用户架构(模型)中的属性。

'物品'参考'评论'引用'用户'持有' user.name'我想要检索的价值。

我的控制器代码,用于按ID数据检索文章并填充“作者”#39;和评论'字段看起来像这样:

    Article.findById(req.params.id)
      .populate('author')
      .populate('comments')
      .exec(function(err, article){
         if(err){
            return req.flash('error', 'Unable to display article.');
         } else {
            res.render('articles/show', {
               article: article
            });
         }
     });

我的文章架构(模型)包含一条评论'这样的财产:

  ... 
  comments: [
      {
         type: Schema.Types.ObjectId,
         ref: "Comment"
      }
   ],
   ...

我的评论架构(模型)包括“作者”和#39;这样的财产:

   ...
   text: String,
   author:
   {
      type: Schema.Types.ObjectId,
      ref: "User"   
   },
   ...

用户架构(模型)具有“'名称'包含我想在视图中显示的值的属性(EJS)。

所以,到目前为止,我一直无法找到显示它的方法,可能是因为没有其他查询我无法做到。

我循环浏览了#article; article.com&#39;数组并使用<%= comment.text %>成功显示评论文字,但我无法找到显示&#39;名称的方法。来自&#39;用户&#39;注释模式(模型)中引用的模式(模型)。

我很感激任何关于我的错误的见解。

3 个答案:

答案 0 :(得分:0)

有可能。你要做的是人口众多。

简单地做

$fields = implode(",", array_keys($arr));
$values = implode(",", array_values($arr));
$query = "INSERT INTO Table1 (".$fields.") VALUES (".$values.")";

在您看来,对于每条评论,您都会执行类似

的操作
Article.findById(req.params.id).populate({
    path: 'comments',
    populate: {
        path: 'author'
    }
}).exec(function(err, article){
    if (err)
        return req.flash('error', 'Unable to display article.');
    res.render('articles/show', { article: article });
});

有关详细信息,请查看此link

答案 1 :(得分:0)

你必须做深度人口

Article.findById(req.params.id).populate({ path: 'article', populate:{ path: 'comments', populate: { path: 'user' } } }).exec(function(err, article){ if (err) return req.flash('error', 'Unable to display article.'); res.render('articles/show', { article: article }); });

答案 2 :(得分:0)

对深度人口的进一步研究并没有为我提供答案。这就是我所做的。

我修改了我的评论架构并创建了'id','username'&amp; 'name'属性/字段如下:

....
var Schema = mongoose.Schema;    
var commentSchema = new Schema({
   text: String,
   author: {
      id:
      {
         type: Schema.Types.ObjectId,
         ref: "User"    
      },
      username: String, 
      name: String      
   },
   ....

可能是DRY违规,但它让我可以获取我需要显示的数据。

我的查询填充了评论和作者字段:

Article.findById(req.params.id)
   .populate('comments')
   .populate('author')
   .exec(function(err, article){
      if(err){
         console.log(err);
         return req.flash('error', 'Unable to display article.');
      } else {
         res.render('articles/show', {
            article: article
         });
      }
   });

我怀疑人口密集是最好的答案,但时间有时迫使我们继续前进。希望这可能会帮助处于类似情况的人。感谢Mikey和Ayush的帮助。