Mongoose _id 对于自定义值而不是默认值无法正常工作

问题描述 投票:0回答:1

嘿!我正在使用猫鼬,其中我有名为标签的集合,这是它的架构


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 并在引用关系中使用它。

javascript node.js mongodb mongoose backend
1个回答
0
投票

根据 mondodb 文档:

_id 保留用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是除数组或正则表达式之外的任何类型。如果_id包含子字段,子字段名称不能以($)符号开头

Mongoose 不会自动将“String”转换为“ObjectID”。在您的标签架构中,_id 是一个字符串,在后架构中,它是导致问题的 ObjectID。您需要将帖子架构中的标签类型更改为字符串。

© www.soinside.com 2019 - 2024. All rights reserved.