3
votes

ID personnalisé LoopBack4 MongoDB Auto Increment

LoopBack lui-même est nouveau pour moi et je vois que la version 4 est bien trop différente de la version 3. Mon exigence est que je dois avoir un identifiant auto incrémenté personnalisé dans mon document mongoDB chaque fois que je crée un POST vers le point final REST similaire à un identifiant en cours d'exécution dans une base de données MySQL.

J'ai vérifié cela ( auto-incrémentation à l'aide de loopback.js et MongoDB ) et ( https: //gist.github. com / drmikecrowe / 5a5568930bad567d4148aad75c94de5a ) avec une configuration de la version 3, mais je n'ai pas trouvé de document approprié pour reproduire la même chose sur la version 4.

Actuellement, j'utilise une application de base sans le box implémentations REST fournies à partir du loopback 4. Voici un exemple de mon modèle.

{
  "_id" : ObjectId("5c373c1168d18c18c4382e00"),  
  "id"  : 1
  "name" : "aaaa",
  "val" : true
}
{
  "_id" : ObjectId("5c3869a55548141c0c27f298"),  
  "id"  : 2
  "name" : "bbbbb",
  "val" : false
}

Mon document mongodb devrait ressembler à ceci:

export class Test extends Entity {
  @property({
   type: 'string',
   id: true,
  })
  _id?: string;

  @property({
   type: 'number',
   generated: true,
   required: false
  })
  id: number;

  @property({
    type: 'string',
    required: true,
  })
  name: string;

  @property({
    type: 'boolean',
    required: true,
  })
  val: boolean;

  constructor(data?: Partial<Test>) {
    super(data);
  }
}


0 commentaires

4 Réponses :


0
votes

Vous pouvez faire quelque chose comme dans cet exemple

@post('/characters', {
    responses: {
      '200': {
        description: 'Character model instance',
        content: {'application/json': {schema: {'x-ts-type': Character}}},
      },
    },
  })
  async create(@requestBody() character: Character): Promise<Character> {
    //add following lines
    let characterId = 1;
    while(await this.characterRepository.exists(characterId)){
      characterId ++;
    }
    character.id = characterId;

    //add above lines
    return await this.characterRepository.create(character);
  }

vous avez probablement déjà remarqué la fonction d'identification automatique. Lorsque vous appelez l'API de publication plusieurs fois (laissez l'identifiant vide), l'identifiant a augmenté de 1 à chaque fois. Cette fonctionnalité est prise en charge par la base de données en mémoire. Mais nous utilisons MongoDB dans ce projet. Si nous voulons avoir cette fonctionnalité, nous devons le faire par programme.

Pour plus d'informations, suivez le lien ci-dessous https://strongloop.com/strongblog/building-online -game-with-loopback-4-pt1 /

voir la section juste au-dessus de l'en-tête de l'explorateur d'API ou recherchez 'auto increment id', vous serez redirigé vers ce paragraphe

J'espère que cela vous aidera, écrivez-moi s'il y a une autre requête. Merci


0 commentaires

0
votes

Je joue également avec Mongo et il peut générer automatiquement votre identifiant pour vous.

Plus précisément, lorsque vous créez votre modèle, en utilisant le modèle lb4, en choisissant «Entity», puis vous êtes invité:

XXX

Cela générera votre modèle avec la propriété:

? What kind of controller would you like to generate? REST Controller with CRUD functions
? What is the name of the model to use with this CRUD repository? Person
? What is the name of your CRUD repository? PersonRepository
? What is the name of ID property? id
? What is the type of your ID? string
? Is the id omitted when creating a new instance? Yes
? What is the base HTTP path name of the CRUD operations? /persons

Super .. alors lors de la création de votre contrôleur CRUD:

  @property({
    type: 'string',
    id: true,
    generated: true,
  })
  id?: string;

Désormais, lorsque vous atteignez votre point de terminaison, la création de POST ne prend pas d'identifiant, mais vous en renvoie un.


0 commentaires

0
votes

Vous pouvez faire quelque chose comme dans cet exemple

@property({
    type: 'number',
    id: true,
    default: 1,
    generated: false
  })
  id: number;

Cela générera votre modèle avec la propriété:

let last_record = await this.testRepository.findOne({order: ['id DESC']});
if(last_record) invoice.id = last_record.id+1;

J'espère que cela aidera , écrivez-moi s'il y a un autre code. Merci


0 commentaires

0
votes

Cette classe hérite de la classe DefaultCrudRepository et remplace la méthode create. La méthode utilise la collection "Counters" pour contenir le dernier identifiant de la classe de données actuelle (this.entityClass.name). La méthode findAndModify empêchera la création de valeurs d'identifiant en double.

import {DefaultCrudRepository, Entity, DataObject, Options} from '@loopback/repository';

export class MongoAutoIncIdRepository<T extends Entity, ID, Relations extends object = {}> extends DefaultCrudRepository<T, ID, Relations> {

  public async create(entity: DataObject<T>, options?: Options): Promise<T> {
    if (!this.dataSource.connected) {
      await this.dataSource.connect()
    }
    
    let mongoConnector = this.dataSource.connector!

    let collection = mongoConnector.db.collection('Counters')

    let result = await collection.findAndModify(
      {
        collection: this.entityClass.name
      },
      [['_id', 'asc']],
      {
        $inc: {value: 1}
      },
      {
        upsert: true,
        new: true
      })

    console.log(result)
    // @ts-ignore
    entity.id = result.value.value
    return super.create(entity, options)
  }

}

C'est facile à utiliser. Héritez votre référentiel non pas de DefaultCrudRepository, mais de MongoAutoIncIdRepository si l'incrémentation automatique est requise. Ensuite, lorsque la méthode create est appelée, l'id augmentera automatiquement de 1.


2 commentaires

bien que ce soit un bon code, cela n'explique rien. Veuillez ajouter une explication de la raison pour laquelle cela fonctionne.


Description ajoutée