【问题标题】:use string as custom id for mongoose model when saving保存时使用字符串作为猫鼬模型的自定义 ID
【发布时间】: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 });

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

【问题讨论】:

    标签: javascript mongodb mongoose nestjs


    【解决方案1】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 2016-01-23
      • 2020-09-05
      • 2013-09-22
      • 1970-01-01
      • 2015-01-14
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多