remove_duplicate_v1_ids.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const { db } = require('../app/js/infrastructure/mongojs')
  2. const async = require('async')
  3. const minimist = require('minimist')
  4. const argv = minimist(process.argv.slice(2))
  5. const commit = argv.commit !== undefined
  6. if (!commit) {
  7. console.log('DOING DRY RUN. TO SAVE CHANGES PASS --commit')
  8. }
  9. db.users.aggregate(
  10. [
  11. { $match: { 'overleaf.id': { $exists: true } } },
  12. { $group: { _id: '$overleaf.id', count: { $sum: 1 } } },
  13. { $match: { count: { $gt: 1 } } }
  14. ],
  15. { allowDiskUse: true },
  16. function(err, results) {
  17. if (err) throw err
  18. console.log('FOUND ' + results.length + ' DUPLICATES')
  19. async.mapSeries(results, removeDuplicates, function(err) {
  20. if (err) throw err
  21. console.log('DONE')
  22. process.exit()
  23. })
  24. }
  25. )
  26. function removeDuplicates(duplicate, callback) {
  27. db.users.findOne({ 'overleaf.id': duplicate._id }, function(err, keepUser) {
  28. if (err) throw err
  29. console.log('KEEPING USER ' + keepUser._id + ' FOR OL ' + duplicate._id)
  30. db.users.find(
  31. { 'overleaf.id': duplicate._id, _id: { $ne: keepUser._id } },
  32. function(err, duplicateUsers) {
  33. if (err) throw err
  34. async.mapSeries(
  35. duplicateUsers,
  36. function(user, cb) {
  37. console.log(
  38. 'UNLINKING USER ' + user._id + ' FOR OL ' + duplicate._id
  39. )
  40. if (!commit) return cb()
  41. db.users.update(
  42. { _id: user._id },
  43. { $unset: { 'overleaf.id': '' } },
  44. cb
  45. )
  46. },
  47. function(err) {
  48. if (err) throw err
  49. callback()
  50. }
  51. )
  52. }
  53. )
  54. })
  55. }