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);
});
});
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);
});
});
https://github.com/Automattic/mongoose/blob/master/examples/mapreduce/mapreduce.js
// 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();
});
}
sample code block
Related articles