mongoose对MongoDB数据库的增删查改

栏目: 数据库 · 发布时间: 5年前

内容简介:专业课上,老师经常告诉我们,数据库的操作无非就是增删查改,即CURD,事实也正是如此,我们接下来看看mongoose操作no SQL数据库MongoDB的CURD。常见的查询条件

专业课上,老师经常告诉我们,数据库的操作无非就是增删查改,即CURD,事实也正是如此,我们接下来看看mongoose操作no SQL数据库 MongoDB 的CURD。

常见操作条件和API

常见的查询条件

$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个元素

常见的查询API,详细请查看文档

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() 的区别,请移除官方文档。

1.连接数据库

连接数据的详细文档请移步mongoose文档。

then回调模式

假设数据库连接地址为 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!
});
复制代码

2.查询数据

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;
复制代码

当前端传相应的数据过来时,这边通过过滤和提取分页字段,利用 limitskip 操作来实现数据分页,也可以使用 mongoose-paginate 插件来简化分页操作,当前端传了对应的筛选字段过来,这边将按 对应字段查询结果,并按age值倒序返回。

2.添加数据

添加数据需要用到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;

复制代码

3.修改数据

数据的修改需要用到 _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;
复制代码

4.删除数据

数据的删除涉及到单条数据的删除和批量删除,可以通过传单个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的操作有个较好的入门。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

内容算法

内容算法

闫泽华 / 中信出版社 / 2018-4-30 / 58.00元

近两年来,伴随着BAT纷纷涌入自媒体平台,自媒体发展可谓迎来爆发。自媒体平台火爆起来是从今日头条异军突起而引发的。它是一款基于数据挖掘的推荐引擎产品,为用户推荐有价值的、个性化的信息,是国内移动互联网领域成长最快的产品服务之一。推荐引擎也将迎来高速发展,针对推荐引擎的优化技术也将会迎来新的机遇。 本书作者从事推荐引擎相关的内容分发相关工作,在书中对内容推荐系统进行了介绍,书的最后,介绍了自媒......一起来看看 《内容算法》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具