Cadena Node.js Mongoose.js a la función ObjectId

174

¿Hay una función para convertir una cadena en un objectId en el nodo usando mangosta? El esquema especifica que algo es un ObjectId, pero cuando se guarda de una cadena, mongo me dice que todavía es solo una cadena. El _id del objeto, por ejemplo, se muestra como objectId("blah").

JRPete
fuente

Respuestas:

419

Puedes hacerlo así:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');
Kevin Dente
fuente
Sí, eso es un poco más limpio en este caso. Puede que solo necesite usar el mongo.BSONPure si lo hace desde Time ()
talentedmrjones
3
¿Esto arroja un error si es una cadena no válida? Buscando la mejor manera de hacer la validación de entrada en una API REST para campos de identificación de mongo.
Zambonilli
1
Realmente no responde la pregunta porque al usar esta metodología, la cadena se convertirá y no será la misma que la original.
ed209
mongoose.Types.ObjectId (id) pero mi identificación no está definida, ¿qué devolverá? nueva identificación o error
Keval Bhatt
@KevinDente Estoy usando Nodejs con Typecript, probé su solución pero aún obtengo una cadena y mi consulta no devuelve lo que debería devolver. alguna idea sobre cómo hacerlo en mecanografiado?
SOufiane Fadil
9

Puedes hacerlo así:

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

EDITAR: El nuevo estándar tiene fromHexString en lugar de fromString

talentosojones
fuente
1
Bueno, aún más "nuevo" estándar parece ser mongoose.mongo.BSONPure.ObjectID.createFromHexString () (a partir de mongoose 3.9.7)
Evereq
1
Para aquellos que intentan hacer esto, esta es una respuesta mucho mejor que la respuesta seleccionada porque no transformará la identificación si ya está usando una identificación mongo.
ed209
1
Esto ya no funciona, use la respuesta aceptada en su lugar
paper1111
BSONPure no es parte de mongoose.mongomí. ¿Alguien puede confirmar?
Artur Tagisow
5

A juzgar por los comentarios, estás buscando:

mongoose.mongo.BSONPure.ObjectID.isValid

O

mongoose.Types.ObjectId.isValid
A
fuente
5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");
vapor accionado
fuente
3
¿Podría comentar sobre la diferencia entre mongoose.Types.ObjectIdy mongoose.mongo.ObjectId? Las propiedades del objeto de la mangosta son diferentes, pero pueden estar haciendo referencia al mismo método debajo. Por favor comente sobre los métodos subyacentes en Typescontra mongo.
impulsado por vapor el
5

No pude resolver este método (es cierto que no busqué mucho)

mongoose.mongo.BSONPure.ObjectID.fromHexString

Si su esquema espera que la propiedad sea de tipo ObjectId, la conversión es implícita, al menos este parece ser el caso en 4.7.8.

Sin embargo, podría usar algo como esto, que le da un poco más de flexibilidad:

function toObjectId(ids) {

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

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

Puedes usar esto también

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

es la forma más sencilla de hacerlo

Ash18
fuente
0

Solo vea el fragmento de código a continuación si está implementando una API REST a través de express y mangosta. (Ejemplo para AGREGAR)

....
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
})
}
...

Espero eso ayude

Manoj Kumar
fuente