Initial commit from Gomix.

This commit is contained in:
System 2017-02-18 18:43:34 +00:00
parent e344b03410
commit 0a6747f2d8
6 changed files with 737 additions and 2 deletions

51
.hyperdev-assets Normal file
View file

@ -0,0 +1,51 @@
{"name":"drag-in-files-copy.svg","date":"2016-03-16T18:27:31.021Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files-copy.svg","type":"image/svg+xml","size":6229,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files-copy.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"tkviVwlaQ2RryM4r"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:21:25.984Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"Pr0LH5dpGcRJ2QSU"}
{"name":"click-for-details.svg","date":"2016-03-16T18:21:23.511Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":6408,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"nuMndaSEzn2KoNFG"}
{"name":"use-url.svg","date":"2016-03-16T18:21:20.130Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","type":"image/svg+xml","size":6155,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(44,180,188)","uuid":"LiyD5Lxg8FrmZlhz"}
{"name":"click-for-details.svg","date":"2016-03-16T18:20:57.943Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":6408,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"04MB8gA2GPoSJ7pp"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:20:56.379Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"q8Au1vYvVFpuGd5b"}
{"name":"use-url.svg","date":"2016-03-16T18:20:52.651Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","type":"image/svg+xml","size":6155,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(44,180,188)","uuid":"9FiKvjvvr4C3oG0i"}
{"name":"1.svg","date":"2016-03-16T18:18:11.204Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2F1.svg","type":"image/svg+xml","size":20524,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2F1.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"MR02bReHwXODf2iH"}
{"name":"2.svg","date":"2016-03-16T18:18:09.776Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2F2.svg","type":"image/svg+xml","size":6597,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2F2.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"Q5gjW3biIe5ubDSw"}
{"name":"3.svg","date":"2016-03-16T18:18:08.145Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2F3.svg","type":"image/svg+xml","size":6856,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2F3.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(44,180,188)","uuid":"ZtH2QDmOOe11lCXh"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:15:33.737Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"5ZhCFJBZeljgrOsm"}
{"name":"click-for-details.svg","date":"2016-03-16T18:15:31.732Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":6408,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"j9DYGSrBdfoh5Qgf"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:13:11.062Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"xs11lHNV40rcZiOr"}
{"name":"click-for-details.svg","date":"2016-03-16T18:13:07.869Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":6397,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"oDrtrMLQDzHj3fCi"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:12:09.577Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"QZQEhdAJwQlN15xh"}
{"name":"click-for-details.svg","date":"2016-03-16T18:12:06.958Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":6395,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"4DsIsyOkpGM5vhnm"}
{"name":"use-url.svg","date":"2016-03-16T18:12:02.187Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","type":"image/svg+xml","size":6155,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(44,180,188)","uuid":"2D0DVLCP7wUxzaXm"}
{"name":"click-for-details.svg","date":"2016-03-16T18:11:49.564Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":6395,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"ellCYXezSjscGSrr"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:11:44.256Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"96WPtGmfDbGjk1Cq"}
{"name":"drag-in-files.svg","date":"2016-03-16T18:11:25.392Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":7990,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"w2iCDrwXU3boaMb0"}
{"uuid":"w2iCDrwXU3boaMb0","deleted":true}
{"uuid":"ellCYXezSjscGSrr","deleted":true}
{"uuid":"96WPtGmfDbGjk1Cq","deleted":true}
{"uuid":"4DsIsyOkpGM5vhnm","deleted":true}
{"uuid":"QZQEhdAJwQlN15xh","deleted":true}
{"uuid":"oDrtrMLQDzHj3fCi","deleted":true}
{"uuid":"xs11lHNV40rcZiOr","deleted":true}
{"uuid":"5ZhCFJBZeljgrOsm","deleted":true}
{"uuid":"j9DYGSrBdfoh5Qgf","deleted":true}
{"uuid":"2D0DVLCP7wUxzaXm","deleted":true}
{"uuid":"04MB8gA2GPoSJ7pp","deleted":true}
{"uuid":"q8Au1vYvVFpuGd5b","deleted":true}
{"uuid":"MR02bReHwXODf2iH","deleted":true}
{"uuid":"9FiKvjvvr4C3oG0i","deleted":true}
{"uuid":"ZtH2QDmOOe11lCXh","deleted":true}
{"uuid":"Q5gjW3biIe5ubDSw","deleted":true}
{"uuid":"Pr0LH5dpGcRJ2QSU","deleted":true}
{"uuid":"tkviVwlaQ2RryM4r","deleted":true}
{"uuid":"LiyD5Lxg8FrmZlhz","deleted":true}
{"uuid":"nuMndaSEzn2KoNFG","deleted":true}
{"name":"use-url.svg","date":"2016-03-29T18:22:42.337Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","type":"image/svg+xml","size":12848,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(44,180,188)","uuid":"BPzdWy4z8l1Yn4EQ"}
{"name":"drag-in-files.svg","date":"2016-03-29T18:22:44.084Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":14823,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"VQVhKMzbgQcBopQk"}
{"uuid":"BPzdWy4z8l1Yn4EQ","deleted":true}
{"uuid":"VQVhKMzbgQcBopQk","deleted":true}
{"name":"click-for-details.svg","date":"2016-03-29T18:22:55.141Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":12623,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"QTRGE6XDqUiSoYO9"}
{"name":"drag-in-files.svg","date":"2016-03-29T18:22:57.596Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":14823,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"RS7rnVaX9eGP4Lri"}
{"uuid":"RS7rnVaX9eGP4Lri","deleted":true}
{"uuid":"QTRGE6XDqUiSoYO9","deleted":true}
{"name":"drag-in-files.svg","date":"2016-03-29T18:23:08.746Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","type":"image/svg+xml","size":14823,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fdrag-in-files.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(100,156,204)","uuid":"fxoJRXwNdZeThuNz"}
{"name":"click-for-details.svg","date":"2016-03-29T18:23:10.422Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","type":"image/svg+xml","size":12623,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fclick-for-details.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(244,188,188)","uuid":"Lp2si7Cpft2ktNM4"}
{"name":"use-url.svg","date":"2016-03-29T18:23:12.439Z","url":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","type":"image/svg+xml","size":12848,"imageWidth":276,"imageHeight":276,"thumbnail":"https://s3.amazonaws.com/hyperweb-editor-assets/us-east-1%3Ad0d03a8e-22bf-451d-ba15-f08d8f4e99ba%2Fuse-url.svg","thumbnailWidth":276,"thumbnailHeight":276,"dominantColor":"rgb(44,180,188)","uuid":"EjI8Y9wdZ9DEXI17"}

View file

@ -1,2 +1,2 @@
# boilerplate-mongomongoose FCC Mongo & Mongoose Challenges
A boilerplate for the freeCodeCamp curriculum. ===============================

280
myApp.js Normal file
View file

@ -0,0 +1,280 @@
/**********************************************
* 3. FCC Mongo & Mongoose Challenges
* ==================================
***********************************************/
/** # MONGOOSE SETUP #
/* ================== */
/** 1) Install & Set up mongoose */
// Add `mongodb` and `mongoose` to the project's `package.json`. Then require
// `mongoose`. Store your **mLab** database URI in the private `.env` file
// as `MONGO_URI`. Connect to the database using `mongoose.connect(<Your URI>)`
/** # SCHEMAS and MODELS #
/* ====================== */
/** 2) Create a 'Person' Model */
// First of all we need a **Schema**. Each schema maps to a MongoDB collection
// and defines the shape of the documents within that collection. Schemas are
// building block for Models. They can be nested to create complex models,
// but in this case we'll keep things simple. A model allows you to create
// instances of your objects, called **documents**.
// Create a person having this prototype :
// - Person Prototype -
// --------------------
// name : string [required]
// age : number
// favoriteFoods : array of strings (*)
// Use the mongoose basic *schema types*. If you want you can also add more
// fields, use simple validators like `required` or `unique`, and set
// `default` values. See the [mongoose docs](http://mongoosejs.com/docs/guide.html).
// <Your code here >
var Person /* = <Your Model> */
// **Note**: GoMix is a real server, and in real servers interactions with
// the db are placed in handler functions, to be called when some event happens
// (e.g. someone hits an endpoint on your API). We'll follow the same approach
// in these exercises. The `done()` function is a callback that tells us that
// we can proceed after completing an asynchronous operation such as inserting,
// searching, updating or deleting. It's following the Node convention and
// should be called as `done(null, data)` on success, or `done(err)` on error.
// **Warning** - When interacting with remote services, **errors may occur** !
// - Example -
// var someFunc = function(done) {
// ... do something (risky) ...
// if(error) return done(error);
// done(null, result);
// };
/** # [C]RUD part I - CREATE #
/* ========================== */
/** 3) Create and Save a Person */
// Create a `document` instance using the `Person` constructor you build before.
// Pass to the constructor an object having the fields `name`, `age`,
// and `favoriteFoods`. Their types must be conformant to the ones in
// the Person `Schema`. Then call the method `document.save()` on the returned
// document instance, passing to it a callback using the Node convention.
// This is a common pattern, all the **CRUD** methods take a callback
// function like this as the last argument.
// - Example -
// ...
// person.save(function(err, data) {
// ...do your stuff here...
// });
var createAndSavePerson = function(done) {
done(null /*, data*/);
};
/** 4) Create many People with `Model.create()` */
// Sometimes you need to create many Instances of your Models,
// e.g. when seeding a database with initial data. `Model.create()`
// takes an array of objects like [{name: 'John', ...}, {...}, ...],
// as the 1st argument, and saves them all in the db.
// Create many people using `Model.create()`, using the function argument
// 'arrayOfPeople'.
var createManyPeople = function(arrayOfPeople, done) {
done(null/*, data*/);
};
/** # C[R]UD part II - READ #
/* ========================= */
/** 5) Use `Model.find()` */
// Find all the people having a given name, using `Model.find() -> [Person]`
// In its simplest usage, `Model.find()` accepts a **query** document (a JSON
// object ) as the first argument, and returns an **array** of matches.
// It supports an extremely wide range of search options. Check it in the docs.
// Use the function argument `personName` as search key.
var findPeopleByName = function(personName, done) {
done(null/*, data*/);
};
/** 6) Use `Model.findOne()` */
// `Model.findOne()` behaves like `.find()`, but it returns **only one**
// document, even if there are more. It is especially useful
// when searching by properties that you have declared as unique.
// Find just one person which has a certain food in her favorites,
// using `Model.findOne() -> Person`. Use the function
// argument `food` as search key
var findOneByFood = function(food, done) {
done(null/*, data*/);
};
/** 7) Use `Model.findById()` */
// When saving a document, mongodb automatically add the field `_id`,
// and set it to a unique alphanumeric key. Searching by `_id` is an
// extremely frequent operation, so `moongose` provides a dedicated
// method for it. Find the (only!!) person having a certain Id,
// using `Model.findById() -> Person`.
// Use the function argument 'personId' as search key.
var findPersonById = function(personId, done) {
done(null/*, data*/);
};
/** # CR[U]D part III - UPDATE #
/* ============================ */
/** 8) Classic Update : Find, Edit then Save */
// In the good old days this was what you needed to do if you wanted to edit
// a document and be able to use it somehow e.g. sending it back in a server
// response. Mongoose has a dedicated updating method : `Model.update()`,
// which is directly binded to the low-level mongo driver.
// It can bulk edit many documents matching certain criteria, but it doesn't
// pass the edited document to its callback, only a 'status' message.
// Furthermore it makes validation difficult, because it just
// direcly calls the mongodb driver.
// Find a person by Id ( use any of the above methods ) with the parameter
// `personId` as search key. Add "hamburger" to the list of her `favoriteFoods`
// (you can use Array.push()). Then - **inside the find callback** - `.save()`
// the updated `Person`.
// [*] Hint: This may be tricky if in your `Schema` you declared
// `favoriteFoods` as an `Array` without specifying the type (i.e. `[String]`).
// In that case `favoriteFoods` defaults to `Mixed` type, and you have to
// manually mark it as edited using `document.markModified('edited-field')`
// (http://mongoosejs.com/docs/schematypes.html - #Mixed )
var findEditThenSave = function(personId, done) {
var foodToAdd = 'hamburger';
done(null/*, data*/);
};
/** 9) New Update : Use `findOneAndUpdate()` */
// Recent versions of `mongoose` have methods to simplify documents updating.
// Some more advanced features (i.e. pre/post hooks, validation) beahve
// differently with this approach, so the 'Classic' method is still useful in
// many situations. `findByIdAndUpdate()` can be used when searching by Id.
//
// Find a person by `name` and set her age to `20`. Use the function parameter
// `personName` as search key.
//
// Hint: We want you to return the **updated** document. In order to do that
// you need to pass the options document `{ new: true }` as the 3rd argument
// to `findOneAndUpdate()`. By default the method
// passes the unmodified object to its callback.
var findAndUpdate = function(personName, done) {
var ageToSet = 20;
done(null/*, data*/);
};
/** # CRU[D] part IV - DELETE #
/* =========================== */
/** 10) Delete one Person */
// Delete one person by her `_id`. You should use one of the methods
// `findByIdAndRemove()` or `findOneAndRemove()`. They are similar to the
// previous update methods. They pass the removed document to the cb.
// As usual, use the function argument `personId` as search key.
var removeById = function(personId, done) {
done(null/*, data*/);
};
/** 11) Delete many People */
// `Model.remove()` is useful to delete all the documents matching given criteria.
// Delete all the people whose name is "Mary", using `Model.remove()`.
// Pass to it a query ducument with the "name" field set, and of course a callback.
//
// Note: `Model.remove()` doesn't return the removed document, but a document
// containing the outcome of the operation, and the number of items affected.
// Don't forget to pass it to the `done()` callback, since we use it in tests.
var removeManyPeople = function(done) {
var nameToRemove = "Mary";
done(null/*, data*/);
};
/** # C[R]UD part V - More about Queries #
/* ======================================= */
/** 12) Chain Query helpers */
// If you don't pass the `callback` as the last argument to `Model.find()`
// (or to the other similar search methods introduced before), the query is
// not executed, and can even be stored in a variable for later use.
// This kind of object enables you to build up a query using chaining syntax.
// The actual db search is executed when you finally chain
// the method `.exec()`, passing your callback to it.
// There are many query helpers, here we'll use the most 'famous' ones.
// Find people who like "burrito". Sort them alphabetically by name,
// Limit the results to two documents, and hide their age.
// Chain `.find()`, `.sort()`, `.limit()`, `.select()`, and then `.exec()`,
// passing the `done(err, data)` callback to it.
var queryChain = function(done) {
var foodToSearch = "burrito";
done(null/*, data*/);
};
/** **Well Done !!**
/* You completed these challenges, let's go celebrate !
*/
/** # Further Readings... #
/* ======================= */
// If you are eager to learn and want to go deeper, You may look at :
// * Indexes ( very important for query efficiency ),
// * Pre/Post hooks,
// * Validation,
// * Schema Virtuals and Model, Static, and Instance methods,
// * and much more in the [mongoose docs](http://mongoosejs.com/docs/)
//----- **DO NOT EDIT BELOW THIS LINE** ----------------------------------
exports.PersonModel = Person;
exports.createAndSavePerson = createAndSavePerson;
exports.findPeopleByName = findPeopleByName;
exports.findOneByFood = findOneByFood;
exports.findPersonById = findPersonById;
exports.findEditThenSave = findEditThenSave;
exports.findAndUpdate = findAndUpdate;
exports.createManyPeople = createManyPeople;
exports.removeById = removeById;
exports.removeManyPeople = removeManyPeople;
exports.queryChain = queryChain;

26
package.json Normal file
View file

@ -0,0 +1,26 @@
{
"name": "fcc-mongo-mongoose-challenges",
"version": "0.0.1",
"description": "A boilerplate project",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.12.4",
"body-parser": "^1.15.2"
},
"engines": {
"node": "4.4.5"
},
"repository": {
"type": "git",
"url": "https://hyperdev.com/#!/project/welcome-project"
},
"keywords": [
"node",
"hyperdev",
"express"
],
"license": "MIT"
}

331
server.js Normal file
View file

@ -0,0 +1,331 @@
/********************************************
* DO NOT EDIT THIS FILE
* the verification process may break
*******************************************/
var express = require('express');
var app = express();
try{
var mongoose = require('mongoose');
} catch (e) {
console.log(e);
}
var fs = require('fs');
var path = require('path');
var bodyParser = require('body-parser');
var router = express.Router();
var enableCORS = function(req, res, next) {
if (!process.env.DISABLE_XORIGIN) {
var allowedOrigins = ['https://marsh-glazer.gomix.me','https://narrow-plane.gomix.me', 'https://www.freecodecamp.com'];
var origin = req.headers.origin;
if(!process.env.XORIGIN_RESTRICT || allowedOrigins.indexOf(origin) > -1) {
console.log(req.method);
res.set({
"Access-Control-Allow-Origin" : origin,
"Access-Control-Allow-Methods" : "GET, POST, OPTIONS",
"Access-Control-Allow-Headers" : "Origin, X-Requested-With, Content-Type, Accept"
});
}
}
next();
};
// global setting for safety timeouts to handle possible
// wrong callbacks that will never be called
var timeout = 10000;
app.use(bodyParser.urlencoded({extended: 'false'}));
app.use(bodyParser.json());
app.get('/', function(req, res) {
res.sendFile(path.join(__dirname, 'views', 'index.html'));
});
router.get('/file/*?', function(req, res, next) {
if(req.params[0] === '.env') { return next({status: 401, message: 'ACCESS DENIED'}) }
fs.readFile(path.join(__dirname, req.params[0]), function(err, data){
if(err) { return next(err) }
res.type('txt').send(data.toString());
});
});
var Person = require('./myApp.js').PersonModel;
router.use(function(req, res, next) {
if(req.method !== 'OPTIONS' && Person.modelName !== 'Person') {
return next({message: 'Person Model is not correct'});
}
next();
});
router.post('/mongoose-model', function(req, res, next) {
// try to create a new instance based on their model
// verify it's correctly defined in some way
var p;
p = new Person(req.body);
res.json(p);
});
var createPerson = require('./myApp.js').createAndSavePerson;
router.get('/create-and-save-person', function(req, res, next) {
// in case of incorrect function use wait timeout then respond
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
createPerson(function(err, data) {
clearTimeout(t);
if(err) { return (next(err)); }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
Person.findById(data._id, function(err, pers) {
if(err) { return (next(err)); }
res.json(pers);
pers.remove();
});
});
});
var createPeople = require('./myApp.js').createManyPeople;
router.post('/create-many-people', function(req, res, next) {
Person.remove({}, function(err) {
if(err) { return (next(err)); }
// in case of incorrect function use wait timeout then respond
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
createPeople(req.body, function(err, data) {
clearTimeout(t);
if(err) { return (next(err)); }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
Person.find({}, function(err, pers){
if(err) { return (next(err)); }
res.json(pers);
Person.remove().exec();
});
});
});
});
var findByName = require('./myApp.js').findPeopleByName;
router.post('/find-all-by-name', function(req, res, next) {
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
Person.create(req.body, function(err, pers) {
if(err) { return next(err) }
findByName(pers.name, function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
res.json(data);
Person.remove().exec();
});
});
});
var findByFood = require('./myApp.js').findOneByFood;
router.post('/find-one-by-food', function(req, res, next) {
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
var p = new Person(req.body);
p.save(function(err, pers) {
if(err) { return next(err) }
findByFood(pers.favoriteFoods[0], function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
res.json(data);
p.remove();
});
});
});
var findById = require('./myApp.js').findPersonById;
router.get('/find-by-id', function(req, res, next) {
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
var p = new Person({name: 'test', age: 0, favoriteFoods: ['none']});
p.save(function(err, pers) {
if(err) { return next(err) }
findById(pers._id, function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
res.json(data);
p.remove();
});
});
});
var findEdit = require('./myApp.js').findEditThenSave;
router.post('/find-edit-save', function(req, res, next) {
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
var p = new Person(req.body);
p.save(function(err, pers) {
if(err) { return next(err) }
try {
findEdit(pers._id, function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
res.json(data);
p.remove();
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
var update = require('./myApp.js').findAndUpdate;
router.post('/find-one-update', function(req, res, next) {
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
var p = new Person(req.body);
p.save(function(err, pers) {
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
try {
update(pers.name, function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
res.json(data);
p.remove();
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
var removeOne = require('./myApp.js').removeById;
router.post('/remove-one-person', function(req, res, next) {
Person.remove({}, function(err) {
if(err) if(err) { return next(err) }
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
var p = new Person(req.body);
p.save(function(err, pers) {
if(err) { return next(err) }
try {
removeOne(pers._id, function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
console.log(data)
Person.count(function(err, cnt) {
if(err) { return next(err) }
data = data.toObject();
data.count = cnt;
console.log(data)
res.json(data);
})
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
});
var removeMany = require('./myApp.js').removeManyPeople;
router.post('/remove-many-people', function(req, res, next) {
console.log(req.body);
Person.remove({}, function(err) {
if(err) if(err) { return next(err) }
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
Person.create(req.body, function(err, pers) {
if(err) { return next(err) }
try {
removeMany(function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
Person.count(function(err, cnt) {
if(err) { return next(err) }
data = JSON.parse(data);
data.count = cnt;
res.json(data);
})
});
} catch (e) {
console.log(e);
return next(e);
}
});
})
});
var chain = require('./myApp.js').queryChain;
router.post('/query-tools', function(req, res, next) {
var t = setTimeout(() => { next({message: 'timeout'}) }, timeout);
Person.remove({}, function(err) {
if(err) if(err) { return next(err) }
Person.create(req.body, function(err, pers) {
if(err) { return next(err) }
if(!data) {
console.log('Missing `done()` argument');
return next({message: 'Missing callback argument'});
}
try {
chain(function(err, data) {
clearTimeout(t);
if(err) { return next(err) }
res.json(data);
});
} catch (e) {
console.log(e);
return next(e);
}
});
})
});
app.use('/_api', enableCORS, router);
// Error handler
app.use(function(err, req, res, next) {
if(err) {
res.status(err.status || 500)
.type('txt')
.send(err.message || 'SERVER ERROR');
}
});
// Unmatched routes handler
app.use(function(req, res){
if(req.method.toLowerCase() === 'options') {
res.end();
} else {
res.status(404).type('txt').send('Not Found');
}
})
var listener = app.listen(process.env.PORT || 3000 , function () {
console.log('Your app is listening on port ' + listener.address().port);
});
/********************************************
* DO NOT EDIT THIS FILE
* the verification process may break
*******************************************/

47
views/index.html Normal file
View file

@ -0,0 +1,47 @@
<!-- This is a static file -->
<!-- served from your routes in server.js -->
<!-- You might want to try something fancier: -->
<!-- html/nunjucks docs: http://mozilla.github.io/nunjucks/ -->
<!-- jade: http://jade-lang.com/ -->
<!-- haml: http://haml.info/tutorial.html -->
<!-- hbs(handlebars): http://handlebarsjs.com/expressions.html -->
<!DOCTYPE html>
<html>
<head>
<title>Welcome to HyperDev!</title>
<meta name="" content="A cool thing made with HyperDev">
<link rel="shortcut icon" href="https://cdn.hyperdev.com/us-east-1%3A52a203ff-088b-420f-81be-45bf559d01b1%2Ffavicon.ico" type="image/x-icon"/>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
background-color: #ddd;
color: #333;
font-family: sans-serif;
text-align: center;
}
</style>
</head>
<body>
<header>
<h1>
3. FCC Mongo & Mongoose Challenges
</h1>
</header>
<main>
</main>
<footer>
<a href="https://hyperdev.com">
Remix this in HyperDev
</a>
</footer>
</body>
</html>