NodeJs 使用 Mongodb

之前我们学习了Mongodb 的Shell命令, 现在我们再一个小小的node项目中使用一下mongodb吧

我们先来初始化一个express项目

第一步

$ npm install express-generator -g
// 全局安装

第二步

$ express testmongodb
// 初始化一个项目

第三步

$ cd testmongodb
$ cnpm install

第四步

// 启动
$ npm start

然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。

更改目录结构

| bin
| modle
    - db.js
| config
    - config.js
| views
| public
| routes
    - index.js
| app.js
| package.json

完善代码阶段

$ cnpm install mongodb ---save
// 安装mongodb
// config.js
var baseUrl = "mongodb://localhost:27017";
var dbbase = "/mongodb_demo"; // 这里是我的数据库名称哦
module.exports = {
  "dburl": baseUrl + dbbase
};
// db.js
/**
 *  数据库封装
 * 
 */

var MongodbClient = require('mongodb').MongoClient
var assert = require('assert')
var config = require('../config/config.js')

/**
 * 连接数据库
 */

function __connectDB(callback) {
  MongodbClient.connect(config.dburl, function (err, db) {
    callback(err, db)
  })
}


/**
 * 插入一条数据
 * @param {*} collectionName 集合名
 * @param {*} Datajson 写入的json数据
 * @param {*} callback 回调函数
 */
function __insertOne(collectionName, Datajson, callback) {
  __connectDB(function (err, db) {
    var collection = db.collection(collectionName);
    collection.insertOne(Datajson, function (err, result) {
      callback(err, result); // 通过回调函数上传数据
      db.close();
    })
  })
}

/**
 * 查找数据
 * @param {*} collectionName 集合名
 * @param {*} Datajson 查询条件
 * @param {*} callback 回调函数
 */

function __find(collectionName, JsonObj, callback) {
  var result = [];
  if (arguments.length != 3) {
    callback("find函数必须传入三个参数哦", null)
    return
  }
  __connectDB(function (err, db) {
    var cursor = db.collection(collectionName).find(JsonObj);
    if (!err) {
      cursor.each(function (err, doc) {
        assert.equal(err, null) // 使用node的assert模块来判断是否出错了
        // 如果出错了,那么下面的也将不会执行了
        if (doc != null) {
          result.push(doc)
        } else {
          callback(null, result)
          db.close();
        }
      })
    }
  })
}

/**
 * 
 * 删除数据(删除满足条件的所有数据哦)
 * @param {*} collectionName 集合名
 * @param {*} json 查询的json数据
 * @param {*} callback 回调函数
 */

function __DeleteMany(collectionName, json, callback) {
  __connectDB(function (err, db) {
    assert.equal(err, null)
    //删除
    db.collection(collectionName).deleteMany(
      json,
      function (err, results) {
        assert.equal(err, null)
        callback(err, results);
        db.close(); //关闭数据库
      }
    );
  });
}


/**
 * 修改数据
 * @param {*} collectionName 集合名
 * @param {*} json1 查询的对象
 * @param {*} json2 修改
 * @param {*} callback 回调函数
 */

function __updateMany(collectionName, json1, json2, callback) {
  __connectDB(function (err, db) {
    assert.equal(err, null)
    db.collection(collectionName).updateMany(
      json1,
      json2,
      function (err, results) {
        assert.equal(err, null)
        callback(err, results)
        db.close()
      }
    )
  })
}


/**
 * 获取总数
 * @param {*} collectionName 集合名
 * @param {*} json 查询条件
 * @param {*} callback 回调函数
 */

function __getCount(collectionName, json, callback) {
  __connectDB(function (err, db) {
    db.collection(collectionName).count(json).then(function (count) {
      callback(count)
      db.close();
    })
  })
}


/**
 * 分页查找数据
 * @param {*} collectionName 集合名
 * @param {*} JsonObj 查询条件
 * @param {*} C 【可选】传入的参数,每页的个数、显示第几页
 * @param {*} C  callback
 */

function __findByPage(collectionName, JsonObj, C, D) {
  var result = []; //结果数组
  if (arguments.length == 3) {
      //那么参数C就是callback,参数D没有传。
      var callback = C;
      var skipnumber = 0;
      //数目限制
      var limit = 0;
  } else if (arguments.length == 4) {
      var callback = D;
      var args = C;
      //应该省略的条数
      var skipnumber = args.pageamount * args.page || 0;
      //数目限制
      var limit = args.pageamount || 0;
      //排序方式
      var sort = args.sort || {};
  } else {
      throw new Error("find函数的参数个数,必须是3个,或者4个。");
      return;
  }

  //连接数据库,连接之后查找所有
  __connectDB(function (err, db) {
      var cursor = db.collection(collectionName).find(JsonObj).skip(skipnumber).limit(limit).sort(sort);
      cursor.each(function (err, doc) {
          if (err) {
              callback(err, null);
              db.close(); //关闭数据库
              return;
          }
          if (doc != null) {
              result.push(doc); //放入结果数组
          } else {
              //遍历结束,没有更多的文档了
              callback(null, result);
              db.close(); //关闭数据库
          }
      });
  });
}


module.exports = {
  __connectDB,
  __insertOne,
  __find,
  __DeleteMany,
  __updateMany,
  __getCount,
  __findByPage
}
// db.js 文件是数据库操作的DAO 层的封装
//app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
// 修改【1】 
global.db = require('./modle/db.js')    // 引入数据库封装好的 DAO 层方法 
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// 修改【2】 这里配置我们的路由
app.use('/', indexRouter)
app.use('/users', usersRouter)
app.use('/testconnect', indexRouter)
app.use('/testdeletemany', indexRouter)
app.use('/testupdatemany', indexRouter)
app.use('/count', indexRouter)
app.use('/testfingbypage', indexRouter)


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
// index.js
// 这里用来配置路由操作
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function (req, res, next) {
  res.render('index', { title: 'Express' });
});

// 测试数据库连接
router.get('/testconnect', function (req, res) {
  global.db.__connectDB(function (err, db) {
    if (err) {
      console.log(err)
      return
    }
    console.log(db)
    res.render('index', { title: '连接数据库成功' })
  })
})

// 测试插入数据
router.get('/testinsert', function (req, res) {
  global.db.__insertOne('student', {
    "name": "zjj",
    "age": 33,
    "interests": ['play'],
    "sex": "男"
  }, function (err, result) {
    if (!err) {
      console.log(result)
      res.render('index', { title: '插入一条数据成功' })
    } else {
      console.log(err)
    }
  })
})

// 查找数据
router.get('/testfind', function (req, res) {
  global.db.__find('student', { age: { $lt: 30 } }, function (err, result) {
    if (!err) {
      console.log(result)
      res.render('index', { title: '查询成功' })
    } else {
      console.log(err)
    }
  })
})

// 删除数据(删除符合条件的全部数据哦)
router.get('/testdeletemany', function (req, res) {
  global.db.__DeleteMany('student', { "age": { $gte: 19 } }, function (err, result) {
    if (!err) {
      console.log(result)
      res.render('index', { title: '删除成功' })
    } else {
      console.log(err)
    }
  })
})

// 修改数据(满足条件的数据全部都会被修改)

router.get('/testupdatemany', function (req, res) {
  global.db.__updateMany(
    'student',
    {
      "name": "zjj"
    },
    {
      $set: { name: "cnm" }
    },
    function (err, result) {
      if (!err) {
        console.log(result)
        res.render('index', {
          title: '修改成功'
        })
      }
    }
  )
})


// 统计总数
router.get('/count', function (req, res) {
  global.db.__getCount('student', {}, function (count) {
    console.log(count)
    res.render('index', {
      title: `一共${count}条数据`
    })
  })
})


// 分页显示
// page是页数,从 0 开始
router.get('/testfingbypage', function (req, res) {
  global.db.__findByPage('student', {}, {
    "pageamount": 6,
    "page": 0
  }, function (err, result) {
    if (err) {
      throw err;
    }
    res.send(result);
    console.log(result.length);
  })
})

module.exports = router;

启动一次

$ npm start

打开localhost:3000测试一下路由吧,再看看自己数据库中是否进行了相关操作了呢~

感谢支持!!

    原文作者:Meils
    原文地址: https://segmentfault.com/a/1190000014132355
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞