保存时使用字符串作为猫鼬模型的自定义 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的主要内容,如果未能解决你的问题,请参考以下文章