保存时使用字符串作为猫鼬模型的自定义 ID

Posted

技术标签:

【中文标题】保存时使用字符串作为猫鼬模型的自定义 ID【英文标题】:use string as custom id for mongoose model when saving 【发布时间】:2020-05-28 23:15:10 【问题描述】:

我想为我的 NestJs API 创建一个包含键/值对的 mongodb 文档。所以键应该是String 类型和Object 类型的值,因为我希望值能够保存任何东西。基于这个问题

https://github.com/Automattic/mongoose/issues/3638#issuecomment-161359387

看来我必须使用 id 字段而不是命名关键字段“key”。首先我创建了一个包含相关信息的界面

export interface Mapping 
  id: string; // this should be "key"
  value: object;

接下来,我为此映射创建了架构。我想我不必在这里指定 id 字段,但我必须禁用 ID 的自动生成

import * as mongoose from 'mongoose';

export const MappingSchema: any = new mongoose.Schema(
  
    value: Object,
  ,
   _id: false ,
);

最后我想在我的映射服务中使用这个模型。所以出于测试目的,我创建了一些函数

@Injectable()
export class MappingsService 
  constructor(
    @InjectModel('Mapping') private readonly mappingModel: Model<Mapping>,
  ) 

  public async getMappings(): Promise<Mapping[]> 
    return this.mappingModel.find();
  

  public async getValueByKey(id: string): Promise<object> 
    const mapping: Mapping = await this.mappingModel.findById(id);

    if (!mapping) 
      // throw some errors
    

    return mapping.value;
  

  public async createMapping(id: string, value: object): Promise<Mapping> 
    const existingMapping: Mapping = await this.mappingModel.findById(id);

    if (existingMapping) 
      // throw some errors
    

    const newMapping: any = new this.mappingModel( id, value );
    return newMapping.save(newMapping);
  

不幸的是,当我想用​​这些值创建一个新映射时

id => "foobar"

值 => foo: "bar"

我得到了错误

MongooseError:文档在保存之前必须有一个 _id。

我也尝试将代码更新为

this.mappingModel( _id: id, value );

但这没有帮助。我该如何解决?

【问题讨论】:

【参考方案1】:

试试这个

    删除任何 _id: 实体模型中的字符串引用 将您的文档导出修改为:
export type FooDocument = Foo & Document & 
        _id: string;
    ;

【讨论】:

以上是关于保存时使用字符串作为猫鼬模型的自定义 ID的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬如何在模型中设置日期格式

无法使用猫鼬推送到阵列

将整数映射到组合框中的自定义类的字符串

猫鼬不能使用字符串类型填充

猫鼬不能使用字符串类型填充

mongoose 5.7.0 中的自定义验证