mongoose對MongoDB數據庫的增刪查改

專業課上,老師常常告訴咱們,數據庫的操做無非就是增刪查改,即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

1.鏈接數據庫

鏈接數據的詳細文檔請移步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!
});
複製代碼

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的操做有個較好的入門。

相關文章
相關標籤/搜索