Node.js Mongoose.js chaîne en fonction ObjectId

174

Existe-t-il une fonction pour transformer une chaîne en objectId dans node en utilisant mangouste? Le schéma spécifie que quelque chose est un ObjectId, mais quand il est enregistré à partir d'une chaîne, mongo me dit que ce n'est toujours qu'une chaîne. Le _id de l'objet, par exemple, est affiché sous la forme objectId("blah").

JRPete
la source

Réponses:

419

Vous pouvez le faire comme ceci:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');
Kevin Dente
la source
Ouais, c'est un peu plus propre dans ce cas. Peut seulement avoir besoin d'utiliser le mongo.BSONPure si vous faites fromTime ()
talentedmrjones
3
Cela génère-t-il une erreur s'il s'agit d'une chaîne non valide? Vous recherchez le meilleur moyen de valider les entrées dans une API REST pour les champs d'identifiant mongo.
Zambonilli
1
Ne répond pas vraiment à la question car en utilisant cette méthodologie, la chaîne sera convertie et ne sera pas la même que l'original.
ed209
mongoose.Types.ObjectId (id) mais mon id est indéfini alors qu'est-ce qu'il retournera? nouvel identifiant ou erreur
Keval Bhatt
@KevinDente J'utilise Nodejs avec Typescript, j'ai essayé votre solution mais j'obtiens toujours une chaîne et ma requête ne renvoie pas ce qu'elle doit renvoyer. une idée sur la façon de le faire sur dactylographié?
SOufiane Fadil
9

Vous pouvez le faire comme ceci:

var mongoose = require('mongoose');
var _id = mongoose.mongo.BSONPure.ObjectID.fromHexString("4eb6e7e7e9b7f4194e000001");

EDIT: Le nouveau standard a fromHexString plutôt que fromString

talentueux
la source
1
Eh bien, encore plus "nouveau" standard semble être mongoose.mongo.BSONPure.ObjectID.createFromHexString () (à partir de mangouste 3.9.7)
Evereq
1
Pour ceux qui tentent de le faire, c'est une bien meilleure réponse que la réponse sélectionnée car elle ne transformera pas l'identifiant si vous utilisez déjà un identifiant mongo.
ed209
1
Cela ne fonctionne plus, utilisez plutôt la réponse acceptée
papier1111
BSONPure ne fait pas partie de mongoose.mongopour moi. Quelqu'un peut-il confirmer?
Artur Tagisow
5

À en juger par les commentaires, vous recherchez:

mongoose.mongo.BSONPure.ObjectID.isValid

Ou

mongoose.Types.ObjectId.isValid
À
la source
5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");
à vapeur
la source
3
Pourriez-vous commenter la différence entre mongoose.Types.ObjectIdet mongoose.mongo.ObjectId? Les propriétés d'objet de la mangouste sont différentes, mais elles peuvent faire référence à la même méthode ci-dessous. S'il vous plaît commenter les méthodes sous - jacentes sur Typesvs mongo.
vapeur le
5

Je n'ai pas pu résoudre cette méthode (certes, je n'ai pas cherché longtemps)

mongoose.mongo.BSONPure.ObjectID.fromHexString

Si votre schéma s'attend à ce que la propriété soit de type ObjectId, la conversion est implicite, du moins cela semble être le cas dans 4.7.8.

Vous pouvez cependant utiliser quelque chose comme ça, ce qui donne un peu plus de flexibilité:

function toObjectId(ids) {

    if (ids.constructor === Array) {
        return ids.map(mongoose.Types.ObjectId);
    }

    return mongoose.Types.ObjectId(ids);
}
Billy Jake O'Connor
la source
3

Vous pouvez également l'utiliser

const { ObjectId } = require('mongodb');
const _id = ObjectId("4eb6e7e7e9b7f4194e000001");

c'est le moyen le plus simple de le faire

Cendre18
la source
0

Consultez simplement l'extrait de code ci-dessous si vous implémentez une API REST via express et mangouste. (Exemple pour ADD)

....
exports.AddSomething = (req,res,next) =>{
  const newSomething = new SomeEntity({
 _id:new mongoose.Types.ObjectId(), //its very own ID
  somethingName:req.body.somethingName,
  theForeignKey: mongoose.Types.ObjectId(req.body.theForeignKey)// if you want to pass an object ID
})
}
...

J'espère que ça aide

Manoj Kumar
la source