mongoose.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const h = require('../helper');
  2. const Mongoose = require('mongoose');
  3. // These .set() calls can be removed when mongoose is upgraded to v5.
  4. Mongoose.set('useNewUrlParser', true);
  5. Mongoose.set('useFindAndModify', false);
  6. Mongoose.set('useUnifiedTopology', true);
  7. const connection = Mongoose.createConnection('mongodb://tfb-database/hello_world');
  8. /**
  9. * Note! The benchmarks say we should use "id" as a property name.
  10. * However, Mongo provides a default index on "_id", so to be equivalent to the other tests, we use
  11. * the same, default index provided by the database.
  12. *
  13. */
  14. // Mongoose Setup
  15. const WorldSchema = new Mongoose.Schema({
  16. _id: Number,
  17. randomNumber: Number
  18. }, {
  19. collection: 'world'
  20. });
  21. const FortuneSchema = new Mongoose.Schema({
  22. _id: Number,
  23. message: String
  24. }, {
  25. collection: 'fortune'
  26. });
  27. const Worlds = connection.model('World', WorldSchema);
  28. const Fortunes = connection.model('Fortune', FortuneSchema);
  29. const toClientWorld = (world) => {
  30. if (world) {
  31. world.id = world._id;
  32. delete world._id;
  33. }
  34. return world;
  35. };
  36. const mongooseRandomWorld = async () => {
  37. return toClientWorld(await Worlds.findOne({
  38. _id: h.randomTfbNumber()
  39. }).lean().exec());
  40. };
  41. const mongooseGetAllFortunes = async () => {
  42. return (await Fortunes.find({})
  43. .lean().exec()).map(toClientWorld);
  44. };
  45. async function getUpdateRandomWorld() {
  46. // it would be nice to use findOneAndUpdate here, but for some reason the test fails with it.
  47. const world = await Worlds.findOne({_id: h.randomTfbNumber()}).lean().exec();
  48. world.randomNumber = h.randomTfbNumber();
  49. await Worlds.updateOne({
  50. _id: world._id
  51. }, {
  52. $set: {
  53. randomNumber: world.randomNumber
  54. }
  55. }).exec();
  56. return toClientWorld(world);
  57. }
  58. module.exports = {
  59. SingleQuery: async (req, res) => {
  60. const result = await mongooseRandomWorld();
  61. h.addTfbHeaders(res, 'json');
  62. res.end(JSON.stringify(result));
  63. },
  64. MultipleQueries: async (queryCount, req, res) => {
  65. const queryFunctions = [];
  66. for (let i = 0; i < queryCount; i++) {
  67. queryFunctions.push(mongooseRandomWorld());
  68. }
  69. const results = await Promise.all(queryFunctions);
  70. h.addTfbHeaders(res, 'json');
  71. res.end(JSON.stringify(results));
  72. },
  73. Fortunes: async (req, res) => {
  74. const fortunes = await mongooseGetAllFortunes();
  75. fortunes.push(h.additionalFortune());
  76. fortunes.sort((a, b) => {
  77. return a.message.localeCompare(b.message);
  78. });
  79. h.addTfbHeaders(res, 'html');
  80. res.end(h.fortunesTemplate({fortunes}));
  81. },
  82. Updates: async (queryCount, req, res) => {
  83. const promises = [];
  84. for (let i = 1; i <= queryCount; i++) {
  85. promises.push(getUpdateRandomWorld());
  86. }
  87. h.addTfbHeaders(res, 'json');
  88. res.end(JSON.stringify(await Promise.all(promises)));
  89. }
  90. };