использовать строку в качестве пользовательского идентификатора для модели mon goose при сохранении - PullRequest
2 голосов
/ 13 февраля 2020

Я хотел бы создать документ mongodb, содержащий пары ключ / значение для моего Nest Js API. Таким образом, ключ должен иметь тип String и значение типа Object, потому что я хочу, чтобы значение могло содержать что угодно . Исходя из этой проблемы

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

кажется, что я должен использовать поле идентификатора вместо того, чтобы называть поле ключа "ключ". Сначала я создал интерфейс, содержащий соответствующую информацию

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

Затем я создал схему для этого сопоставления. Я думаю, мне не нужно указывать поле 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"

value => {foo: "bar"}

Я получаю ошибку

MongooseError: документ должен иметь _id перед сохранением.

Я также пытался обновить код до

this.mappingModel({ _id: id, value });

, но это не помогло. Как я могу это исправить?

...