在 Mongoose 中使用 populate() 返回已保存项目的列表

Posted

技术标签:

【中文标题】在 Mongoose 中使用 populate() 返回已保存项目的列表【英文标题】:Return list of saved items using populate() in Mongoose 【发布时间】:2021-07-27 03:17:21 【问题描述】:

我正在尝试创建一个页面,显示每个用户保存的项目,到目前为止,我的视图显示的是 JSON 字符串,我想呈现原始文档(图像、标题、日期……) 试图更好地理解 populate() 。 谢谢

在数据库中

  
    "_id":"$oid":"6089d131efbe7e3e0c5c51f3",
    "joinDate":"$date":"2021-04-28T21:17:06.928Z",
    "name":"...",
    "email":"...",
    "password":"...",
    "createdAt":"$date":"2021-04-28T21:18:41.832Z",
    "updatedAt":"$date":"2021-04-28T21:18:41.832Z",
    "__v":0,
    "avatar":"18756.png",
    "savedArticles":[
    "5eb91189c2de0f24fc1517db", // >> ObjectId of original
    "585ad7294a91aa0de83d8ac4"
    ]

我的功能:

router.get('/savedItems/:id/', checkAuthenticated, (req, res) => 
  const id = req.params.id;
  mongoose.model('Users').find(
    _id: id
   )
   .populate('savedArticles', 'title')
   .exec(function(err, results) 
       if (err) 
        console.log(err)
           return;
       
       res.render('savedItems.ejs',  savedArticles: results, user: req.user )
       console.log( JSON.stringify(results))
   );
)

型号:

var Schema = mongoose.Schema;
var userSchema = new Schema(
// ...
    savedArticles:[type: Schema.Types.ObjectId, ref: 'Article' ]
, autoCreate: true)

var Schema = mongoose.Schema;
var articleSchema = new Schema(
    title:   type: String, required: true ,
 //...
  
)
const Users = mongoose.model('Users', userSchema)
const Article = mongoose.model('Article', articleSchema)

鉴于:

        <% for(i=0; i < savedArticles.length; i++) %>
                <a href='#'><%= savedArticles[i].savedArticles %></a>
                <%  %>
        

输出:

     _id: 5eb91189c2de0f24fc1517db, title: 'Gatsby' ,  
 _id: 585ad7294a91aa0de83d8ac4, title: 'Blade runner' 

输出更新对象


  _id: ...,
  name: '',
  email: '',
  password: '....',
  savedArticles: [
    
      _id: ...,
      title: '...',
      director: '...',
      year: '...'
    ,
    
     _id: ...,
      title: '...',
      director: '...',
      year: '...'
    
  ],

【问题讨论】:

【参考方案1】:

当您执行populate 时,mongoose 将基于存储在savedArticles 数组中的_ids 并从带有_idsArticles 集合文档中获取,它将更改@987654327 @ 在 savedArticles 数组中包含实际文档。因此,当您的前端得到结果时,savedArticles 数组将是对象数组(来自Articles 集合的文档)而不是_ids 数组。 现在您可以遍历该数组并访问每篇文章的特定字段,例如:savedArticles[0].title

【讨论】:

感谢我所怀疑的清晰解释,因为我读过或多或少相同的内容(据我所知)。 savedArticles[0].title 似乎没有返回任何内容。可能是我的错.. 尝试console.log()你在前端获得的整个文档,并检查它是否有savedArticles对象数组。 如果您检查您发布的有问题的output,则有title 字段。 我接受您的回答,但是我无法通过您的示例获得输出。我正在控制台中检索整个对象数组,是的。 by dong > .populate('savedArticles') 但是 savedArticles[0].title 不返回第一个项目的标题.. 像 savedArticles[i].key 一样在视图中循环也对我不起作用.. 好吧,所有articles 都在那里,如您所见。您如何在html 中访问它们?我看到您尝试直接访问savedArticles,但您必须将其作为响应对象的属性进行访问。像这样的东西:response.savedArticles[0].title.

以上是关于在 Mongoose 中使用 populate() 返回已保存项目的列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongoose 中使用 populate() 返回已保存项目的列表

Mongoose .populate 随机

find(...).populate 不是 mongoose 中的函数

Mongoose 动态模型,不能使用 populate()

Mongoose - 使用 .populate 访问嵌套对象

无法从 Mongoose 访问 populate()'d 对象的属性?