We do a daily backup of our firestore data in our cloud functions. It's as simply as
const firestore = require('@google-cloud/firestore');
const client = new firestore.v1.FirestoreAdminClient();
export const dailyFirestoreBackup = functions
.runWith({ timeoutSeconds: 540 })
.pubsub.schedule('00 0 * * *')
.onRun((context) => {
const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT;
const databaseName =
client.databasePath(projectId, '(default)');
return await client.exportDocuments({
name: databaseName,
outputUriPrefix: 'gs://your-backup-bucket',
// Leave collectionIds empty to export all collections
// or set to a list of collection IDs to export,
// collectionIds: ['users', 'customers']
collectionIds: []
});
});
You can then in those cases recover your data from the previous day by downloading the bucket data from the day before.

When it's a specific id you are looking for you can even simply run
grep -R "<documentId>" .
to get the file you are looking for.
Or you try to setup a local firestore emulator and import the data there.
UPDATE
Since some time you also have the possibility to use the point-in-time recovery for your firestore database. Find more information about it here.
This might be a better option for you if you don't have functions set up. I by myself didn't try it yet though.