专业课上,老师常常告诉咱们,数据库的操做无非就是增删查改,即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的操做有个较好的入门。