add_multiple_emails.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const mongojs = require('../app/src/infrastructure/mongojs')
  2. const { db } = mongojs
  3. const async = require('async')
  4. const minilist = require('minimist')
  5. const updateUser = function(user, callback) {
  6. console.log(`Updating user ${user._id}`)
  7. const update = {
  8. $set: {
  9. emails: [
  10. {
  11. email: user.email,
  12. createdAt: new Date()
  13. }
  14. ]
  15. }
  16. }
  17. db.users.update({ _id: user._id }, update, callback)
  18. }
  19. const updateUsers = (users, callback) =>
  20. async.eachLimit(users, ASYNC_LIMIT, updateUser, function(error) {
  21. if (error) {
  22. callback(error)
  23. return
  24. }
  25. counter += users.length
  26. console.log(`${counter} users updated`)
  27. loopForUsers(callback)
  28. })
  29. var loopForUsers = callback =>
  30. db.users
  31. .find({ emails: { $exists: false } }, { email: 1 })
  32. .limit(FETCH_LIMIT, function(error, users) {
  33. if (error) {
  34. callback(error)
  35. return
  36. }
  37. if (users.length === 0) {
  38. console.log(`DONE (${counter} users updated)`)
  39. return callback()
  40. }
  41. updateUsers(users, callback)
  42. })
  43. var counter = 0
  44. var run = () =>
  45. loopForUsers(function(error) {
  46. if (error) {
  47. throw error
  48. }
  49. process.exit()
  50. })
  51. let FETCH_LIMIT, ASYNC_LIMIT
  52. var setup = function() {
  53. let args = minilist(process.argv.slice(2))
  54. FETCH_LIMIT = args.fetch ? args.fetch : 100
  55. ASYNC_LIMIT = args.async ? args.async : 10
  56. }
  57. setup()
  58. run()