在 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
并从带有_ids
的Articles
集合文档中获取,它将更改@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() 返回已保存项目的列表
find(...).populate 不是 mongoose 中的函数