Mongoose 中的自增字段
Auto-increment field in Mongoose
我正在尝试使用 Mongoose 创建一个 API,我有一个模型,我想在其中自动增加 postID 的值。
我有 post 架构
const PostSchema = new Schema({
title: {
type: String,
required: true
},
postID: {
type: Number,
unique: true,
required: true
},
body: {
type: String,
required: true
},
author: {
type: Schema.Types.ObjectId,
ref: 'Author',
required: true
},
dateCreated: {
type: Date,
required: true
},
lastModified: {
type: Date,
required: false
},
modifiedBy: {
type: Schema.Types.ObjectId,
ref: 'Author',
required: false
},
picture: {
type: mongoose.SchemaTypes.Url,
required: false
}
}, {collection: 'Post'});
并且我创建了一个预保存挂钩
export const PostModel = mongoose.model('Post', PostSchema);
PostSchema.pre('save', true, async function (next) {
const post = this;
post._id = new ObjectID();
post.dateCreated = new Date();
try {
const lastPost = await PostModel.find({postID: {$exists: true}}).sort({id: -1}).limit(1);
post.postID = lastPost.postID + 1;
} catch (e){
console.log('could not take the last post')
}
if(post && post.hasOwnProperty('body') && !post.body.isModified){
return next();
}
if(post && post.hasOwnProperty('body') && post.body.isModified){
post.lastModified = new Date();
return next();
}
});
处理添加创建日期,并自动递增 postID。但是,每当我向 API 发送突变以创建新的 post 时,我都会收到一个错误
Post validation failed: dateCreated: Path dateCreated is required., id: Path id is required.
这意味着 none 在预保存挂钩中处理的工作已经完成。每当我向解析器添加一些随机值时,突变就会成功完成。知道为什么预保存不起作用吗?
这是我的解析器
module.exports.addPost = async(_,args, req) => {
const post = new PostModel({
title: args.post.title,
body: args.post.body,
author: new ObjectID(args.post.author),
picture: args.post.picture
});
try {
return await post.save();
} catch (e) {
console.log('Could not save the post');
console.log(e);
}
};
这里是突变
curl 'http://localhost:3001/graphql' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: http://localhost:3001' --data-binary '{"query":"mutation($post: PostInput){\n addPost(post: $post){\n title\n body\n author\n }\n}","variables":{"post":{"title":"newTitle","body":"Lorem ipsum","author":"5e07e6c07156cb000092ab45","picture":"http://www.example.com"}}}' --compressed
上面的代码片段不起作用。根据 Mongoose 的文档,在编译模型后调用 pre 或 post 钩子不起作用。所以你应该移动
export const PostModel = mongoose.model('Post', PostSchema);
在预挂钩下方。此外,由于 PostModel
尚未定义,并且您想将对象的最后一个 ID 插入到您的数据库中,因此您可以将此检查移至您的解析器。
let lastPost = await PostModel.find({id: {$exists: true}}).sort({id: -1}).limit(1);
// This always returns an array, either empty or with data
if(Array.isArray(lastPost) && lastPost.length > 0){
lastPost = lastPost[0]
}
const post = new PostModel({
...
id: lastPost['id'] + 1
...
});
if(Array.isArray(lastPost) && lastPost.length === 0) {
post.id = 0;
// If this lastPost is an empty array and you try to access the id property
// you will get an error that NaN to Int conversion failed
}
希望对您有所帮助
我正在尝试使用 Mongoose 创建一个 API,我有一个模型,我想在其中自动增加 postID 的值。 我有 post 架构
const PostSchema = new Schema({
title: {
type: String,
required: true
},
postID: {
type: Number,
unique: true,
required: true
},
body: {
type: String,
required: true
},
author: {
type: Schema.Types.ObjectId,
ref: 'Author',
required: true
},
dateCreated: {
type: Date,
required: true
},
lastModified: {
type: Date,
required: false
},
modifiedBy: {
type: Schema.Types.ObjectId,
ref: 'Author',
required: false
},
picture: {
type: mongoose.SchemaTypes.Url,
required: false
}
}, {collection: 'Post'});
并且我创建了一个预保存挂钩
export const PostModel = mongoose.model('Post', PostSchema);
PostSchema.pre('save', true, async function (next) {
const post = this;
post._id = new ObjectID();
post.dateCreated = new Date();
try {
const lastPost = await PostModel.find({postID: {$exists: true}}).sort({id: -1}).limit(1);
post.postID = lastPost.postID + 1;
} catch (e){
console.log('could not take the last post')
}
if(post && post.hasOwnProperty('body') && !post.body.isModified){
return next();
}
if(post && post.hasOwnProperty('body') && post.body.isModified){
post.lastModified = new Date();
return next();
}
});
处理添加创建日期,并自动递增 postID。但是,每当我向 API 发送突变以创建新的 post 时,我都会收到一个错误
Post validation failed: dateCreated: Path dateCreated is required., id: Path id is required.
这意味着 none 在预保存挂钩中处理的工作已经完成。每当我向解析器添加一些随机值时,突变就会成功完成。知道为什么预保存不起作用吗?
这是我的解析器
module.exports.addPost = async(_,args, req) => {
const post = new PostModel({
title: args.post.title,
body: args.post.body,
author: new ObjectID(args.post.author),
picture: args.post.picture
});
try {
return await post.save();
} catch (e) {
console.log('Could not save the post');
console.log(e);
}
};
这里是突变
curl 'http://localhost:3001/graphql' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: http://localhost:3001' --data-binary '{"query":"mutation($post: PostInput){\n addPost(post: $post){\n title\n body\n author\n }\n}","variables":{"post":{"title":"newTitle","body":"Lorem ipsum","author":"5e07e6c07156cb000092ab45","picture":"http://www.example.com"}}}' --compressed
上面的代码片段不起作用。根据 Mongoose 的文档,在编译模型后调用 pre 或 post 钩子不起作用。所以你应该移动
export const PostModel = mongoose.model('Post', PostSchema);
在预挂钩下方。此外,由于 PostModel
尚未定义,并且您想将对象的最后一个 ID 插入到您的数据库中,因此您可以将此检查移至您的解析器。
let lastPost = await PostModel.find({id: {$exists: true}}).sort({id: -1}).limit(1);
// This always returns an array, either empty or with data
if(Array.isArray(lastPost) && lastPost.length > 0){
lastPost = lastPost[0]
}
const post = new PostModel({
...
id: lastPost['id'] + 1
...
});
if(Array.isArray(lastPost) && lastPost.length === 0) {
post.id = 0;
// If this lastPost is an empty array and you try to access the id property
// you will get an error that NaN to Int conversion failed
}
希望对您有所帮助