fix_string_backedUpBlobs_ids.mjs 1.2 KB

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