# MongoDB ## Prerequisite - NoSQL => not only SQL - Non-Relational => You still can store relational data (just in different way) - Document DataBase - Stored in `bson (binary json)` but represented as `json` - [Some Concepts about MongoDB](https://dotblogs.com.tw/sungnoone/2012/01/11/65274) - [Cheat Sheet](https://gist.github.com/codeSTACKr/53fd03c7f75d40d07797b8e4e47d78ec) ## Mongoose > The **`.save()`** is an instance method of the model, while the **`.create()`** is called directly from the Model as a method call, being static in nature, and takes the object as a first parameter. ```javascript= const mongoose = require('mongoose'); const notificationSchema = mongoose.Schema({ "datetime" : { type: Date, default: Date.now }, "ownerId":{ type:String }, "customerId" : { type:String }, "title" : { type:String }, "message" : { type:String } }); const Notification = mongoose.model('Notification', notificationsSchema); function saveNotification1(data) { var notification = new Notification(data); notification.save(function (err) { if (err) return handleError(err); // saved! }) } function saveNotification2(data) { Notification.create(data, function (err, small) { if (err) return handleError(err); // saved! }) } ``` - Example2 ```javascript= router.post("/", (req, res) => { const user = new User({ isAdmin: req.body.isAdmin, chineseName: req.body.chineseName, }); user.save() .then((data) => res.json(data)) .catch((err) => { res.json(`err: ${err}`); }); }); ``` - Example2 (try, catch) ```javascript= try { const data = await user.save(); res.json(data); } catch (err) { res.json(`err: ${err}`); } ``` - `$set` - https://docs.mongodb.com/manual/reference/operator/update/set/ ## Mongoose (CRUD) - `model.create(docs)` - returns all the data ```javascript= model.create({ name: "Allen", age: 15, school: "NTHU", FAQ: [{"Ques":"Q1", "Ans":"A1"}], }) ``` <hr /> - `model.find(filter, projection, { limit, skip, sort}).select()` - limit: `Number` - skip: `Number` - sort: `object` - Ex: { name: 1 } - `.select()`: 配合 `projection` - returns all the data ```javascript= model.find( { name: "Allen" }, 'name age', { limit, skip, sort } ).select().lean(); ``` <hr /> - `model.findOne(filter)` - returns all the data ```javascript= model.findOne( { _id: "621bb7afa12afd5f13d00e4d" } ).lean(); ``` <hr /> - `model.updateOne(filter, update)` - filter: `object` - update: `object` - MongoDB will update only the first document that matches filter regardless of the value of the multi option. - return `object` containing: - `matchedCount` - number of documents matched - `modifiedCount` - number of documents modified - `acknowledge` - boolean indicating everything went smoothly - `upsertId` - null or an id containing a document that had to be upserted - `upsertedCount` - number indicating how many documents had to be upserted. Will either be 0 or 1 ```javascript= model.updateOne( { _id: "621bb7afa12afd5f13d00e4d" }, { name: "modified", age: 45 } ).lean(); ``` <hr /> - `model.deleteOne(filter)` - filter: `object` - returns an `object` containing: - `deletedCount`: 1 ```javascript= model.deleteOne( { _id: "621bb7afa12afd5f13d00e4d" } ) ``` <hr /> - `model.deleteMany()` - filter: `object` - returns an `object` containing: - `deletedCount: x`: where x is the number of documents deleted. ```javascript= model.deleteMany( { name: "Allen", age: { $gte: 18 } } ) ``` <hr /> - [operators](https://docs.mongodb.com/manual/reference/operator/query/) - `$or` `$gte` ## Cooperate with Docker - https://hub.docker.com/_/mongo