專業課上,老師常常告訴咱們,數據庫的操做無非就是增刪查改,即CURD,事實也正是如此,咱們接下來看看mongoose操做no SQL數據庫MongoDB的CURD。javascript
常見操做條件和APIhtml
常見的查詢條件前端
$or
或關係
$nor
或關係取反
$gt
大於
$gte
大於等於
$lt
小於
$lte
小於等於
$ne
不等於
$in
在多個值範圍內
$nin
不在多個值範圍內
$all
匹配數組中多個值
$regex
正則,用於模糊查詢
$size
匹配數組大小
$maxDistance
範圍查詢,距離(基於LBS)
$mod
取模運算
$near
鄰域查詢,查詢附近的位置(基於LBS)
$exists
字段是否存在
$elemMatch
匹配內數組內的元素
$within
範圍查詢(基於LBS)
$box
範圍查詢,矩形範圍(基於LBS)
$center
範圍醒詢,圓形範圍(基於LBS)
$centerSphere
範圍查詢,球形範圍(基於LBS)
$slice
查詢字段集合中的元素(好比從第幾個以後,第N到第M個元素
java
常見的查詢API,詳細請查看文檔mongodb
Model.deleteMany()
刪除全部文檔集合的匹配條件 至關於remove()
參數分別爲:條件、操做、回調
Model.deleteOne()
刪除匹配條件的文檔集合的第一個文檔 想當於remove()
參數分別爲:條件、回調
Model.find()
查詢文檔 參數分別爲:條件、選擇字段、操做、回調
Model.findById()
經過_id字段查詢文檔 至關於findOne({ _id: id })
參數分別爲:id、選擇字段、操做、回調
Model.findByIdAndDelete()
大多數狀況使用它 經過_id字段查詢文檔並刪除 至關於findOneAndDelete({ _id: id })
的快捷方式 參數分別爲:id、操做、回調
Model.findByIdAndRemove()
經過_id字段查詢文檔並移除 至關於findOneAndRemove({ _id: id })
的快捷方式 參數分別爲:id、操做、回調
Model.findByIdAndUpdate()
經過_id字段查詢文檔並更新 至關於findOneAndUpdate({ _id: id }, ...)
參數分別爲:id、更新字段、操做、回調
Model.findOne()
查詢一個文檔 參數分別爲:條件、選擇字段、操做、回調
Model.findOneAndDelete()
查詢一個匹配的文檔並刪除 參數分別爲:條件、操做、回調
Model.findOneAndRemove()
查詢一個匹配的文檔並移除 參數分別爲:條件、操做、回調
Model.findOneAndUpdate()
查詢一個匹配的文檔並更新 參數分別爲:條件、更新字段、操做、回調
Model.replaceOne()
覆蓋一個已經存在的文檔 至關於update()
參數分別爲:條件、更新字段、操做、回調
Model.updateMany()
更新多個已經存在的文檔 至關於update()
參數分別爲:條件、更新字段、操做、回調
Model.updateOne()
更新一個已經存在的文檔 至關於update()
參數分別爲:條件、更新字段、操做、回調
Model.remove()
移除全部匹配的文檔 參數分別爲:條件、回調
Model.update()
更新一個文檔 參數分別爲:條件、更新字段、操做、回調
數據庫
關於findByIdAndDelete()
和findByIdAndRemove()
的區別,請移除官方文檔。express
鏈接數據的詳細文檔請移步mongoose文檔。json
then回調模式api
假設數據庫鏈接地址爲mongodb://localhost:27017/TestDB
數組
假設數據操做模型Model爲:
// peopleModel.js
let mongoose = require('mongoose');
let Schema = mongoose.Schema;
let PeopleSchema = new Schema({
name: String,
age: Number,
sex: Number,
class: String
});
module.exports = mongoose.model('People', PeopleSchema, 'peopleCollection');
複製代碼
const mongoose = require("mongoose");
var mongourl = 'mongodb://localhost:27017/TestDB';
mongoose.connect(mongourl).then(
() => {
console.log('鏈接成功!')
},
err => {
console.log('出錯!', err);
}
);
複製代碼
on監聽模式
let mongoose = require('mongoose');
let mongoURL = 'mongodb://localhost:27017/TestDB';
mongoose.connect(mongoURL);
mongoose.Promise = global.Promise;
let db = mongoose.connection;
db.on('error',console.error.bind(console, 'MongoDB connection error:'));
db.once('open', function() {
// we're connected!
});
複製代碼
let express = require('express');
let router = express.Router();
let mongoose = require('mongoose');
let People = require('../models/peopleModel');
router.get('/', function(req, res, next){
// 需使用body-parse中間件獲取參數
let filters = { ...req.query };
console.log(filters, 'filter');
// 要查詢的字段
let query = {};
if(filters.name){
query.name = filters.name
}
if(filters.age){
//查詢年齡大於age參數
query.bookInfo = {$gt: filters.age}
}
People.find(query, null, {
limit: filters.pageSize,
skip: (filters.pageSize * filters.pageNum),
sort:'-createBy.age'
}, (err, data) => { //查找全部
if(err){
res.status(500).json({ error: err });
}else{
res.json({ code: 1, data: data });
}
})
});
module.exports = router;
複製代碼
當前端傳相應的數據過來時,這邊經過過濾和提取分頁字段,利用limit
和skip
操做來實現數據分頁,也能夠使用mongoose-paginate
插件來簡化分頁操做,當前端傳了對應的篩選字段過來,這邊將按 對應字段查詢結果,並按age值倒序返回。
添加數據須要用到mongoose的save()
方法
let express = require('express');
let router = express.Router();
let mongoose = require('mongoose');
let People = require('../models/peopleModel');
router.post('/', function(req, res, next){
const name = req.body.name,
age = req.body.age,
sex = req.body.sex,
class = req.body.class;
const newPeople = new People({
name,
age,
sex,
class });
// 新增保存
newPeople.save((err, data) => {
if(err){
res.status(500).json({ error: err });
}else{
res.json({ code: 1, data: data });
}
});
});
module.exports = router;
複製代碼
數據的修改須要用到_id
字段,這個字段會在MongoDB數據庫每增長一條新的記錄時自動生成,也是惟一標識,同時,須要用到findByIdAndUpdate()
方法來操做數據更新。
let express = require('express');
let router = express.Router();
let mongoose = require('mongoose');
let People = require('../models/peopleModel');
router.post('/', function(req, res, next){
const _id = req.body._id,
name = req.body.name,
age = req.body.age,
sex = req.body.sex,
class = req.body.class;
const updateFields = {
_id,
name,
age,
sex,
class };
// 經過_id更新指定指字段
People.findByIdAndUpdate({_id, _id}, updateFields, (err, data) => {
if(err){
res.status(500).json({ error: err });
}else{
res.json({ code: 1, data: data })
}
});
});
module.exports = router;
複製代碼
數據的刪除涉及到單條數據的刪除和批量刪除,能夠經過傳單個id字符或者id字符串數組來實現不一樣的刪除功能,須要用到$in
條件操做符和remove()
方法。
let express = require('express');
let router = express.Router();
let mongoose = require('mongoose');
let People = require('../models/peopleModel');
router.post('/', function(req, res, next){
let ids = req.body._id;
let condition;
if(Array.isArray(ids)){
condition = {
_id: { $in: ids }
}
}else{
condition = {
_id: ids
}
}
People.remove(condition, (err, data) => {
if(err){
res.status(500).json({ error: err });
}else{
res.json({ code: 1, data: data })
}
})
});
module.exports = router;
複製代碼
至此,mongoose對於MongoDB的增刪查改操做案例都實現了,相信你們會對MongoDB的操做有個較好的入門。