m Mongoose for MongoDb

Key Points


References

Reference_description_with_linked_URLs_______________________Notes______________________________________________________________








Tutorials










Articles and Examples


https://github.com/Automattic/mongoose/blob/master/examples/mapreduce/mapreduce.jsMongoose mapReduce example


https://kb.objectrocket.com/mongo-db/how-to-join-collections-using-mongoose-228Create a review for a product and update the product with the review









Key Concepts



Basic CRUD with Mongoose



Join Query using Populate

https://kb.objectrocket.com/mongo-db/how-to-join-collections-using-mongoose-228

Lastly, here’s our route to create get a single Product, the related Review including all the Review fields. Here we use the populate() function to populate the review field of the Product with all the Review fields.

 query with populate
// Route for retrieving a Product by id and populating it's Review.
app.get("/products/:id", function(req, res) {
  // Using the id passed in the id parameter, prepare a query that finds the matching one in our db...
  db.Product.findOne({ _id: req.params.id })
    // ..and populate all of the notes associated with it
    .populate("review")
    .then(function(dbProduct) {
      // If we were able to successfully find an Product with the given id, send it back to the client
      res.json(dbProduct);
    })
    .catch(function(err) {
      // If an error occurred, send it to the client
      res.json(err);
    });
});



Update Query in 2 parts - create a review for a product

https://kb.objectrocket.com/mongo-db/how-to-join-collections-using-mongoose-228


In order for our joins to start coming into play we’ll need to Review on Product. Here’s our route that takes in the id of an existing Product and creates a Review for it. We use Mongoose to first create the Review db.Review.create(req.body) and if that succeeds we find the associated Product and update it’s review field. For this we use the findOneAndUpdate() function. If everything is successful then we return the updated Product.

 mongoose update join ex
// Route for creating a new Review and updating Product "review" field with it
app.post("/product/:id", function(req, res) {
  // Create a new note and pass the req.body to the entry
  db.Review.create(req.body)
    .then(function(dbReview) {
      // If a Review was created successfully, find one Product with an `_id` equal to `req.params.id`. Update the Product to be associated with the new Review
      // { new: true } tells the query that we want it to return the updated Product -- it returns the original by default
      // Since our mongoose query returns a promise, we can chain another `.then` which receives the result of the query
      return db.Product.findOneAndUpdate({ _id: req.params.id }, { review: dbReview._id }, { new: true });
    })
    .then(function(dbProduct) {
      // If we were able to successfully update a Product, send it back to the client
      res.json(dbProduct);
    })
    .catch(function(err) {
      // If an error occurred, send it to the client
      res.json(err);
    });
});




Mongoose mapReduce example

https://github.com/Automattic/mongoose/blob/master/examples/mapreduce/mapreduce.js

mapReduce ex
// import async to make control flow simplier
'use strict';

const async = require('async');

// import the rest of the normal stuff
const mongoose = require('../../lib');

require('./person.js')();

const Person = mongoose.model('Person');

// define some dummy data
const data = [
  {
    name: 'bill',
    age: 25,
    birthday: new Date().setFullYear((new Date().getFullYear() - 25)),
    gender: 'Male'
  },
  {
    name: 'mary',
    age: 30,
    birthday: new Date().setFullYear((new Date().getFullYear() - 30)),
    gender: 'Female'
  },
  {
    name: 'bob',
    age: 21,
    birthday: new Date().setFullYear((new Date().getFullYear() - 21)),
    gender: 'Male'
  },
  {
    name: 'lilly',
    age: 26,
    birthday: new Date().setFullYear((new Date().getFullYear() - 26)),
    gender: 'Female'
  },
  {
    name: 'alucard',
    age: 1000,
    birthday: new Date().setFullYear((new Date().getFullYear() - 1000)),
    gender: 'Male'
  }
];


mongoose.connect('mongodb://localhost/persons', function(err) {
  if (err) throw err;

  // create all of the dummy people
  async.each(data, function(item, cb) {
    Person.create(item, cb);
  }, function(err) {
    if (err) {
      // handle error
    }

    // alright, simple map reduce example. We will find the total ages of each
    // gender

    // create the options object
    const o = {};

    o.map = function() {
      // in this function, 'this' refers to the current document being
      // processed. Return the (gender, age) tuple using
      /* global emit */
      emit(this.gender, this.age);
    };

    // the reduce function receives the array of ages that are grouped by the
    // id, which in this case is the gender
    o.reduce = function(id, ages) {
      return Array.sum(ages);
    };

    // other options that can be specified

    // o.query = { age : { $lt : 1000 }}; // the query object
    // o.limit = 3; // max number of documents
    // o.keeptemp = true; // default is false, specifies whether to keep temp data
    // o.finalize = someFunc; // function called after reduce
    // o.scope = {}; // the scope variable exposed to map/reduce/finalize
    // o.jsMode = true; // default is false, force execution to stay in JS
    o.verbose = true; // default is false, provide stats on the job
    // o.out = {}; // objects to specify where output goes, by default is
    // returned, but can also be stored in a new collection
    // see: http://mongoosejs.com/docs/api.html#model_Model.mapReduce
    Person.mapReduce(o, function(err, results, stats) {
      console.log('map reduce took %d ms', stats.processtime);
      console.log(results);
      cleanup();
    });
  });
});

function cleanup() {
  Person.remove(function() {
    mongoose.disconnect();
  });
}




Potential Value Opportunities



Potential Challenges



Candidate Solutions



Step-by-step guide for Example



sample code block

sample code block
 



Recommended Next Steps