猫鼬 document.save() 后人口错误
Wrong population after document.save() in mongoose
我正在尝试创建一个博客,return 已填充的博客采用以下模式:
const blogSchema = new mongoose.Schema({
title: {
type:String
},
author: {
type: mongoose.Schema.Types.ObjectID,
ref: 'UserTable',
required: true
}
});
module.exports = mongoose.model('BlogPostTable', blogSchema);
和
const userSchema = new mongoose.Schema({
username:{
type:String,
},
blogPosts: [
{
type: mongoose.Schema.Types.ObjectID,
ref: 'BlogPostTable'
}
]
});
module.exports = mongoose.model('UserTable', userSchema);
我正在保存这样的博客:
blogRouter.post('/', async (request, response, next) => {
const token = request.token;
try {
const foundUser = await userTable.findById(decodedToken.id); // Find User
const newBlog = new blogTable({ // Create document
title: request.body.title,
text: request.body.text,
likes: 0,
author: foundUser._id
});
await newBlog.save(); // Save Blog
foundUser.blogPosts = foundUser.blogPosts.concat(newBlog); // update Users blogs
await foundUser.save();
response.status(200).json(newBlog.populate('author').toJSON()); // WRONG OUTPUT
}
不过,
作者填错了。没有username
,id
是一个数组!
我哪里出错了,如何解决?
您可以添加以下代码行以查看代码中发生的情况:
mongoose.set('debug', true);
第一个语句:await newBlog.save();
触发一个 insertOne
操作,文档设置 author
:author: ObjectId("...")
然后你 运行 await foundUser.save();
明确设置了一个博客文章数组:
{ '$set': { blogPosts: [ ObjectId(...), ObjectId(...) ] }
这是有道理的,因为您在 JS 代码中使用了 concat
。问题是没有其他第三个查询,因为您正在尝试 运行 populate
现有的内存中对象,这将不起作用 - 填充需要查询而不是内存中对象。
因此您必须再次查询您的数据库才能得到 author
填充:
let userPosts = await blogTable
.find({ author: foundUser._id })
.populate('author');
console.log(userPosts);
触发两个查询:
Mongoose: blogposttables.find({ author: ObjectId("...") }, { projection: {} })
Mongoose: usertables.find({ _id: { '$in': [ ObjectId("...") ] } }, { projection: {} })
我正在尝试创建一个博客,return 已填充的博客采用以下模式:
const blogSchema = new mongoose.Schema({
title: {
type:String
},
author: {
type: mongoose.Schema.Types.ObjectID,
ref: 'UserTable',
required: true
}
});
module.exports = mongoose.model('BlogPostTable', blogSchema);
和
const userSchema = new mongoose.Schema({
username:{
type:String,
},
blogPosts: [
{
type: mongoose.Schema.Types.ObjectID,
ref: 'BlogPostTable'
}
]
});
module.exports = mongoose.model('UserTable', userSchema);
我正在保存这样的博客:
blogRouter.post('/', async (request, response, next) => {
const token = request.token;
try {
const foundUser = await userTable.findById(decodedToken.id); // Find User
const newBlog = new blogTable({ // Create document
title: request.body.title,
text: request.body.text,
likes: 0,
author: foundUser._id
});
await newBlog.save(); // Save Blog
foundUser.blogPosts = foundUser.blogPosts.concat(newBlog); // update Users blogs
await foundUser.save();
response.status(200).json(newBlog.populate('author').toJSON()); // WRONG OUTPUT
}
不过,
作者填错了。没有username
,id
是一个数组!
我哪里出错了,如何解决?
您可以添加以下代码行以查看代码中发生的情况:
mongoose.set('debug', true);
第一个语句:await newBlog.save();
触发一个 insertOne
操作,文档设置 author
:author: ObjectId("...")
然后你 运行 await foundUser.save();
明确设置了一个博客文章数组:
{ '$set': { blogPosts: [ ObjectId(...), ObjectId(...) ] }
这是有道理的,因为您在 JS 代码中使用了 concat
。问题是没有其他第三个查询,因为您正在尝试 运行 populate
现有的内存中对象,这将不起作用 - 填充需要查询而不是内存中对象。
因此您必须再次查询您的数据库才能得到 author
填充:
let userPosts = await blogTable
.find({ author: foundUser._id })
.populate('author');
console.log(userPosts);
触发两个查询:
Mongoose: blogposttables.find({ author: ObjectId("...") }, { projection: {} })
Mongoose: usertables.find({ _id: { '$in': [ ObjectId("...") ] } }, { projection: {} })