Javascript 保存时使用字符串作为mongoose模型的自定义id

Javascript 保存时使用字符串作为mongoose模型的自定义id,javascript,mongodb,mongoose,nestjs,Javascript,Mongodb,Mongoose,Nestjs,我想为我的NestJSAPI创建一个包含键/值对的mongodb文档。因此,键的类型应该是String,值的类型应该是Object,因为我希望值能够保存任何内容。基于这个问题, 似乎我必须使用id字段,而不是将密钥字段命名为“key”。首先,我创建了一个保存相关信息的界面 export interface Mapping { id: string; // this should be "key" value: object; } 接下来,我为这个映射创建了模式。我想我不必在这里指定i

我想为我的NestJSAPI创建一个包含键/值对的mongodb文档。因此,键的类型应该是
String
,值的类型应该是
Object
,因为我希望值能够保存任何内容。基于这个问题,

似乎我必须使用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:string引用
  • 将文档导出修改为:
  • this.mappingModel({ _id: id, value });
    
    export type FooDocument = Foo & Document & {
            _id: string;
        };