我有一个带有嵌套模式的Schema系统,用于创建一对多关系。
用户架构
const expenseSchema = new Schema({
expense: String,
value: Number
});
const budgetSchema = new Schema({
earnings: Number,
expenses: [expenseSchema]
});
const userSchema = new Schema({
username: String,
name: String,
googleId: String,
budget: [budgetSchema]
});
我正在尝试将值推入这些嵌套模式,但是遇到了一些麻烦。 注意,req.user值是通过Passport认证的已认证用户
这是我尝试将数据添加到预算架构的收入属性中。奇怪的是,当我在发布请求后登录用户时,它显示为未定义。
router.post("/", (req, res) => {
User.findOneAndUpdate(req.user, {
$push: {
budget: {
earnings: req.body.earning
}
}
});
console.log(req.user);
});
Vue形式
submitBudget() {
const expenses = this.mergeKeyAndValue();
axios
.post("http://localhost:3000/budget", {
earning: this.earnings,
expenses
})
.then(response => {
console.log(response.data);
})
.catch(e => {
console.error(e);
});
}
答案 0 :(得分:0)
router.post("/", (req, res) => {
User.findOneAndUpdate(req.user,
{$push:{
budget: {
earnings: req.body.earning
}
}
}
)
console.log(req.user);
})
在这里,您没有为User.findOneAndUpdate()提供回调函数,并且没有该函数,您所要做的就是查询数据库而不保存任何内容。
来自猫鼬文档中有关Model.findOneAndUpdate()
的信息A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options) // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update) // returns Query -> This is what you are doing right now.
A.findOneAndUpdate() // returns Query
此外,您的语法不正确,这可能就是为什么您不确定的原因。它应该是Users.findOneAndUpdate({ username: req.user },.....
或存储请求对象的req.user
用户名密钥的任何地方。
您可以通过以下方式使用async / await重写整个函数:
router.post("/", async (req, res) => {
const update = await User.findOneAndUpdate(
{ username: req.user.username },
{
$push: {
budget: {
earnings: req.body.earning
}
}
}
)
console.log(update);
});
我没有一种简便的方法来测试$push
更新,因此,我假设您知道自己在做什么,但其余的都应按所述进行。