Search code examples
node.jsdatabasemongodbuniqueidentifier

Delete MongoDB-document by its string-ID


I have a MongoDB-document that looks like this:

{
    _id: 'EXISTING_ID'
}

I want to delete this document and I tried to use this code to do so (leveraging the native node-js driver for 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");

however, the TypeScript-compiler throws an error, saying that no overloads match this call; _id should rather be of type ObjectId. However, if I replace the call with:

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

I get a runtime error, saying:

BSONTypeError: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters

because the string "EXISTING_ID" is only 11 bytes in size.

However, I don't even think, that ObjectId is the right type to use here, as I don't see ObjectId in the database. The _id for the document above is a string.

In Java, there are the methods findById or deleteById, but I don't see these in NodeJS. Is there a way to achieve what I want, that I just haven't found yet?


Solution

  • You need to specify type of _id field used in "my-collection". The Filter type of the deleteOne parameter uses InferIdType which is ObjectId by default.

    At least inline:

    dbo.collection<{_id: string}>("my-collection").deleteOne({ _id: id }, (err, obj) => {
    

    but honestly, if you are using typescript you'd better have the proper named type for objects in "my-collection".