fix_string_backedUpBlobs_ids.mjs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // @ts-check
  2. import { backedUpBlobs } from '../lib/mongodb.js'
  3. import { mongoId } from '../lib/assert.js'
  4. import { ObjectId } from 'mongodb'
  5. import commandLineArgs from 'command-line-args'
  6. const STATS = {
  7. total: 0,
  8. replaced: 0,
  9. skipped: 0,
  10. }
  11. const config = commandLineArgs([
  12. { name: 'commit', type: Boolean, defaultValue: false },
  13. ])
  14. async function processRecord(record) {
  15. STATS.total++
  16. try {
  17. mongoId(record._id)
  18. const newId = new ObjectId(record._id)
  19. if (config.commit) {
  20. await backedUpBlobs.updateOne(
  21. { _id: newId },
  22. {
  23. $addToSet: { blobs: { $each: record.blobs } },
  24. },
  25. { upsert: true }
  26. )
  27. await backedUpBlobs.deleteOne({ _id: record._id })
  28. }
  29. STATS.replaced++
  30. } catch (error) {
  31. console.log(error)
  32. STATS.skipped++
  33. }
  34. }
  35. const cursor = backedUpBlobs
  36. .find({ _id: { $type: 'string' } })
  37. .project({ _id: 1, blobs: 1 })
  38. while (await cursor.hasNext()) {
  39. const record = await cursor.next()
  40. await processRecord(record)
  41. }
  42. console.log(
  43. `${!config.commit ? 'DRY RUN' : ''} ${STATS.total} records ${STATS.replaced} replaced, ${STATS.skipped} skipped`
  44. )
  45. process.exit()