嘿!我正在使用猫鼬,其中我有名为标签的集合,这是它的架构
const tagSchema = new Schema<ITag, ITagModel>(
{
_id: {
type: String,
unique: true,
required: true,
},
},
{
versionKey: false,
},
);
export default tagSchema;
我想在我的帖子集中使用它,这是它的模式
const postSchema = new Schema<IPost, IPostModel>(
{
content: {
type: String,
minLength: PostConstant.POST_CONTENT_MIN_LENGTH,
maxLength: PostConstant.POST_CONTENT_MAX_LENGTH,
trim: true,
required: true,
},
tags: {
type: [
{
type: Schema.Types.ObjectId,
ref: TagsConstant.TAGS_COLLECTION_NAME,
},
],
},
},
{
timestamps: true,
versionKey: false,
},
);
现在的问题是,当我想首先创建帖子时,我会根据这样的帖子标签创建标签
postSchema.statics.createPost = async (payload: ICreatePost) => {
try {
// eslint-disable-next-line prefer-const
let { tags } = payload;
try {
if (tags) {
(tags as unknown as Array<ITag>) = tags.map((tag: string) => ({
_id: tag,
}));
await TagModel.insertMany(tags, {
ordered: false,
});
/*
{ordered:false} because if any of the tag exist in tag collection then ingnore it instead of stoping the process
*/
}
} catch (error) {
/* */
}
tags = payload.tags;
return await PostModel.create({
...payload,
});
} catch (error) {
errorHandler(error);
}
};
我的计划是,如果集合中不存在任何标签,我将根据给定标签创建标签,然后将创建它。我已将 tagSchema _id 命名为标签名称,这样如果我在任何其他模式中分配此 _id,那么我将获得标签列表,而无需填充标签集合。但这里显示了该错误
{
"success": false,
"message": "Post validation failed: tags.0: Cast to [ObjectId] failed for value \"[ 'tag1', 'tag2', 'tag3' ]\" (type string) at path \"tags.0\" because of \"CastError\"",
"error": {}
}
据我所知,猫鼬会自动将任何字符串_id转换为ObjectId,它仅适用于猫鼬自动生成的_id,但不适用于我的自定义_id。我怎样才能做这种类型的工作,它自动转换我的自定义 _id 并插入到帖子集合的标签字段中。
我正在尝试使用自定义 _id 并在引用关系中使用它。
根据 mondodb 文档:
_id 保留用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是除数组或正则表达式之外的任何类型。如果_id包含子字段,子字段名称不能以($)符号开头
Mongoose 不会自动将“String”转换为“ObjectID”。在您的标签架构中,_id 是一个字符串,在后架构中,它是导致问题的 ObjectID。您需要将帖子架构中的标签类型更改为字符串。