Mongoose динамически сохраняет одну и ту же модель в нескольких коллекциях

#mongoose #nestjs

#mongoose #nestjs

Вопрос:

Возможно ли сохранить введенную модель mongoose в нескольких коллекциях? (nestjs inection)

Я ищу что-то вроде

 injectedMode.collection('collectionA').save(data);
injectedMode.collection('collectionB').save(data);
  

Иногда мне нужно сохранить модель в одну коллекцию, а иногда и в другую.
Пожалуйста, помните, что модель вводится, и в моем случае я хочу иметь коллекцию для каждого клиента. таким образом, одна и та же модель должна динамически сохраняться в определенной коллекции

Спасибо

Ответ №1:

NestJS позволяет вам получить доступ к собственному соединению Mongoose, которое, в свою очередь, предоставляет доступ к объекту соединения db , поэтому вы можете создать следующую службу:

 @Injectable()
export class DynamicMongoDbService {
  constructor (@InjectConnection() private connection: Connection) {
  }

  async insert(collectionName: string, data: any) {
    return this.connection.db.collection(collectionName).insert(data);
  }
}
  

и позже используйте эту службу соответствующим образом:

 this.dynamicMongoDbService.insert('collectionA', data);
this.dynamicMongoDbService.insert('collectionB', data);
  

Редактировать:

Если модели известны во время компиляции, вы также можете создать сервис, который вводит все необходимые модели и сохраняет их на карте. Затем, при использовании сервиса, вы динамически решаете, какую модель выбрать, и делегируете ей:

 @Injectable()
export class DynamicMongoDbService {

  private modelMap: Record<string, Model<any>>;

  constructor (
    @InjectModel(Cat.name) catModel: Model<Cat>,
    @InjectModel(Dog.name) dogModel: Model<Dog>) {
    this.modelMap = {
      [Cat.name]: catModel,
      [Dog.name]: dogModel
    };
  }

  async insertDynamically<M, T> (modelType: typeof M, data: T) {
    const model = this.modelMap[modelType.name];
    return model.save(data);
  }
}
  

Используйте это так:

 this.dynamicMongoDbService.insert(Cat, data);
this.dynamicMongoDbService.insert(Dog, data);
  

Комментарии:

1. Делая это, я теряю возможность внедрять модель и все преимущества сильных возможностей типов и API, нет? могу ли я по-прежнему использовать модель ?. а как насчет запросов? Спасибо!

2. Это правда, может быть, есть другой способ — я подумаю об этом 🙂

3. Отредактировал ответ, что вы думаете об этой идее?

4. Это хорошо, но проблема в том, что мне нужна коллекция для каждого клиента (своего рода изолированное облако для каждого клиента). так что, вероятно, мне придется: customerA: Model<Data> — это неизвестно во время компиляции … спасибо за попытку помочь.