2 votes

Créer un ObjectId dans mongoose en utilisant une chaîne d'origine (seed string)

Je veux créer un identifiant d'objet dans Mongoose en utilisant une chaîne de caractères d'amorçage

Id = new ObjectId("alex"); 

Quelque chose de similaire. Mais tous les exemples que j'ai vus pour générer l'identifiant d'objet nécessitent de passer la chaîne de caractères dans le format de hachage de l'identifiant d'objet.

Y a-t-il un moyen de faire ce que je veux ?

1voto

aaronheckmann Points 3875

Les ObjectIds n'acceptent pas les graines. Si vous voulez simplement des _ids personnalisés pour vos documents, vous pouvez les déclarer en tant que chaînes de caractères, nombres, etc. dans votre schéma.

Schema({ _id: String })

1voto

Daniel Points 2194

Vous pouvez utiliser ce code

/**
 * https://docs.mongodb.com/manual/reference/method/ObjectId/
 * @param seed - string allowing to create predictable mongo id value ( the same for any execution )
 * @param date - date of creation - first 4 bytes of id
 * @returns {ObjectId}
 */
function mongoIdFromSeed(seed, date = "2022-01-01") {
  return new ObjectID(dayjs(date).unix().toString(16) + crypto.createHash("md5").update(seed).digest("hex").substr(0, 16));
}

pour un seed y date vous obtiendrez les mêmes résultats à tout moment.


Ce code dépend de la bibliothèque dayjs vous pouvez supprimer cette dépendance en utilisant

new Date(date).getTime() / 1000 | 0

au lieu de unix méthode. Je veux dire

function mongoIdFromSeed(seed, date = "2022-01-01") {
  return new ObjectID((new Date(date).getTime() / 1000 | 0).toString(16) + crypto.createHash("md5").update(seed).digest("hex").substr(0, 16));
}

0voto

Ric0 Points 520

Si quelqu'un est toujours à la recherche d'une solution, le gist suivant peut aider.

import mongoose from "mongoose";
import RandomGenerator from "random-seed-generator";

const mockIt = (modifier = Math.random()) => {
  let mock = RandomGenerator.createWithSeeds("Mock" + modifier).hexString(24);
  return mock;
};

export const mockObjectId = (str, options) => {
  const { plainText = false } = options || {};
  const id = mongoose.Types.ObjectId(mockIt(str));
  return plainText ? id.toString() : id;
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X