如何在mongoose中填充对象

时间:2018-03-17 18:16:47

标签: node.js mongodb mongoose populate

我想要做的是一个todo应用程序,您可以在其中创建用户并使用该用户登录。每个用户都可以单个待办事项进行CRUD,并且可以获取链接到该特定用户的所有待办事项。 这是userSchema的架构

const userSchema = new Schema({
firstName:{type:String,trim:true},
lastName:{type:String,trim:true},
userName:{type:String,required:true,unique:true,sparse:true,trim:true},
email:{type:String,required:true,unique:true,sparse:true,trim:true},
phoneNumber:{type:String,unique:true,sparse:true,required:true},
hash:{type:String,required:true}
})

我有todoSchema

 author:{type: Schema.Types.ObjectId},
title:{type:String, required:true, trim:true},
context:{type:String, trim:true,},
isFinished:{type:Boolean,required:true,default: false},
finishedAt:{type:Date}

我也有与JWT一起使用的登录系统,我的问题是如何使用当前登录的用户的id保存待办事项。以及如何获取链接到用户的所有待办事项目前已登录 我不希望todos作为数组存储在userSchema中,而是作为不同的模式,您可以为每个todo执行CRUD - 我正在阅读一些名为populate的东西,它带有猫鼬,但我不知道如何实现它 - 如果你能给我一些想法怎么做,那将是非常好的..我不需要全面实施..谢谢你

- 如果您需要更多代码,请https://github.com/jkuzmanovik/todoApi

1 个答案:

答案 0 :(得分:1)

一旦用户登录(我猜您使用的是护照),护照就会创建req.user。 req.user将包含创建护照插件时用户模式中给出的所有详细信息。

这可用于填充您的toDo架构,如下所示:

在你要求的get请求中

toDo.find({}) .populate('author') ...

但如果你的目标是找到用户的所有toDos,你可以按照以下方式进行操作

toDo.find({author:req.user._id})

只有在身份验证之后才能执行此操作。 这将为您提供用户的所有待办事项。

PS:一旦你只填充作者字段将被用户对象本身替换(不是正确的单词,但可以理解),它对过滤没有帮助。应该谨慎使用Mongoose人口,因为数据库资源很耗,并且会降低服务器性能。

关于JWT,无论何时进行req,都需要将JWT传递给服务器(通过URL,授权标头等)。有一种名为extract的方法,它将从JWT令牌中提取用户,因此可以进行身份​​验证。 有关passport-jwt和jsonwebtoken的阅读文档的更多信息。