es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar documento de MongoDB mediante su ID de cadena

Tengo un documento de MongoDB que se ve así:

{
    _id: 'EXISTING_ID'
}

Quiero eliminar este documento e intenté usar este código para hacerlo (aprovechando el controlador nativo de Node.js para MongoDB):

import { MongoClient, ObjectId } from "mongodb";

export const deleteDocumentWithId = (id: string) => {
  return MongoClient.connect(dbUrl, (err, db) => {
    if (err) {
      throw err;
    }

    const dbo = db.db("my-db");

    dbo.collection("my-collection").deleteOne({ _id: id }, (err, obj) => {
      if (err) {
        throw err;
      }
      db.close();
    });

  });
};

deleteDocumentWithId("EXISTING_ID");

Sin embargo, el compilador de TypeScript muestra un error, diciendo que no hay sobrecargas que coincidan con esta llamada; _id debería ser de tipo ObjectId. Sin embargo, si reemplazo la llamada con:

dbo.collection("my-collection").deleteOne({ _id: new ObjectId(id) }...

Obtengo un error en tiempo de ejecución, que dice:

BSONTypeError: El argumento pasado debe ser una única cadena de 12 bytes o una cadena de 24 caracteres hexadecimales.

porque la cadena “EXISTING_ID” tiene solo 11 bytes de tamaño.

Sin embargo, ni siquiera creo que ObjectId sea el tipo correcto para usar aquí, ya que no veo ObjectId en la base de datos. El _id para el documento anterior es un string.

En Java, existen los métodos findById o deleteById, pero no veo estos en Node.js. ¿Hay alguna forma de lograr lo que quiero y que aún no he encontrado?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error se produce porque el ID existente no está en el formato correcto para un “ObjectId”.

    Si el _id del documento es una cadena de texto y no un ObjectId, entonces deberías poder eliminar el documento utilizando el siguiente código:

    dbo.collection("mi-colección").deleteOne({ _id: id }, (err, obj) => {
      if (err) {
        throw err;
      }
      db.close();
    });
    

    Esto debería funcionar siempre y cuando el _id sea un identificador único en la colección.

    Si deseas utilizar un ObjectId, puedes convertir la cadena de texto al formato correcto utilizando el método ObjectId.isValid() para verificar si la cadena está en el formato correcto, y luego utilizando new ObjectId(id) para crear un nuevo ObjectId a partir de la cadena:

    import { ObjectId } from "mongodb";
    
    export const deleteDocumentWithId = (id: string) => {
      if (!ObjectId.isValid(id)) {
        throw new Error(`${id} no es un ObjectId válido`);
      }
    
      const objectId = new ObjectId(id);
    
      return MongoClient.connect(dbUrl, (err, db) => {
        if (err) {
          throw err;
        }
    
        const dbo = db.db("mi-db");
    
        dbo.collection("mi-colección").deleteOne({ _id: objectId }, (err, obj) => {
          if (err) {
            throw err;
          }
          db.close();
        });
      });
    };
    
    deleteDocumentWithId("ID_EXISTENTE");
    

    Este código verificará si la cadena es un ObjectId válido, y si lo es, creará un nuevo ObjectId y lo utilizará para eliminar el documento con el _id correspondiente.

Comments are closed.