Node.js操作MongoDB数据库

使用Mongoose操作MongoDB

Mongoose是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。

关于在Mac下安装和使用MongoDB可以看我之前的一篇文章:

文章传送门:Mac下安装MongoDB 及使用教程

MongoDB PATH环境变量配置

mongodb添加到环境变量中:$ vim ~/.zshrc,添加如下命令行:


export PATH="$PATH:/usr/local/mongodb/bin"

当然前提是将解压出来的文件移到/usr/local/mongodb目录中。版本3.0.7

然后就可以在终端直接使用MongoDB命令,而不用每次都进入MongoDB所在文件夹的目录啦。

比如,启动MongoDB,直接在终端输入 $ mongo 就可以启动啦

默认运行在 http://127.0.0.1:27017

还可以自定义端口:$ mongod --dbpath=data/db --port=27017或者输入:$ mongo 127.0.0.1:27017

Mongoose的使用

首先新建一个名为mongo的文件夹,该文件夹就是数据库目录。然后在该目录下安装mongoose

$ npm install mongoose

在该目录下新建一个名为script.js的文件:

var mongoose = require('mongoose');

var uri = 'mongodb://username:password@hostname:port/databasename';
 uri = 'mongodb://localhost/mongo';

mongoose.connect(uri);

//在Schma里定义数据类型
var BookSchma = new mongoose.Schema({ //定义一个Schema
    name: String,
    author: String,
    publishTime:Date
});

mongoose.model('Book',BookSchma);//将该Schema发布为Model

通过Model我们就可以创建、删除和修改mongodb里面的文档,MongoDB为我们提供了SchemaSchema则提供了数据类型和结构的定义。

然后在该目录下再新建一个名为insert.js的文件:

var mongoose = require('mongoose');
require('./script.js');
var Book = mongoose.model('Book');//Book为model name

var book = new Book({
    name: 'MEAN Web Development',
    author: 'trigkit4',
    publishTime: new Date()
});

book.save(function (err) {
    console.log('save status:',err ? 'failed' : 'success');
});

打开终端,进入数据库目录(文件夹目录),输入$ node insert.js,不出意外应该可以看到:

save status: success

find查询操作,返回结果包含在数组里(单个的请使用findOne()

    
    var mongoose = require('mongoose');
    require('./script');
    
    var Book = mongoose.model('Book');
    
    /*
    
    find参数:
    1.<Object>mongodb selector
    2.<Function>err:错误信息,results:查询结果
     */
    
    Book.find({}, function (err,results) {
        if(err){
            console.log('error message',err);
            return;
        }
        console.log('results',results);
    });

$or(array)$and(array)

新建一个名为or.js的文件

var mongoose = require('mongoose');
require('./script');

var Book = mongoose.model('Book');

var condition ={
    $or: [
        {author: 'trigkit4'},
        {author: 'Mike'}
    ]
};
Book.find(condition, function (err, results) {
    if(err){
        console.log('condition error',err);
        return;
    }
    console.log('condition',condition,'results',results);
});

终端输入$ node or.js,不出意外应该能输出:

condition { '$or': [ { author: 'trigkit4' }, { author: 'Mike' } ] }
 results [ { __v: 0,
    publishTime: Fri Nov 27 2015 22:13:14 GMT+0800 (CST),
    author: 'trigkit4',
    name: 'MEAN Web Development',
    _id: 565864fae48504c03d92f319 } ]

关于Array

ArrayJavaScript编程语言中并不是数组,而是集合,因此里面可以存入不同的值,以下代码等价:

var Schema1 = new Schema({array:[]});
var Schema2 = new Schema({array:Array});
var Schema3 = new Schema({array:[Schema.Types.Mixed]});
var Schema4 = new Schema({array:[{}]});

在Express中使用Mongoose

首先先安装express-generator

$ npm install express-generator -g

安装好后,在终端执行:

$ express mongooseExpress

用来生成一个express实例。

然后我们在这个mongooseExpress文件夹下新建一个名为config的文件夹,然后在config下新建一个config.js文件:

module.exports = {
    mongodb: 'mongodb://localhost/mongo'
};

在再config文件夹下新建一个名为mongoose.js的文件:

var mongoose = require('mongoose');
var config = require('./config');

module.exports = function () {
    var db = mongoose.connect(config.mongodb);//连接数据库
    
    return db;//返回数据库实例
};

然后我们再新建一个名为models的文件夹,然后新建一个名为user.server.model.js的文件:

var mongoose = require('mongoose');
var UserSchema = new mongoose.Schema({
    uid: Number,
    username: String,
    createTime: Date,
    lastLogin: Date
});

mongoose.model('user',UserSchema);

然后在刚才的mongoose.js中添加如下代码:

require('../models/user.server.model.js');

打开app.js,添加如下代码:

var mongoose = require('./config/mongoose');
var db = mongoose();

使用Mongoose读取数据

首先打开routes文件夹下的users.js文件,添加如下代码:

var mongoose = require('mongoose');
var User = mongoose.model('User');

router.get('/test', function (req, res, next) {
  var user = new User({
    uid: 123,
    username: 'trigkit4'
  });

  user.save(function (err) {
    if(err){
      res.end('Error');
      return next();
    }
    
    //find({})意为返回所有文档
    User.find({}, function (err, results) {
      if(err){
        res.end('Error');
        return next();
      }
      res.json(results);//以json数据类型返回值
    })
  })
});

最后,打开终端,进入mongooseExpress目录,执行

$ npm install

package.json的依赖安装好后,再执行:

$ npm install mongoose --save

在终端输入cat package.json,可以看到

{
  "name": "mongooseExpress",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "jade": "~1.11.0",
    "mongoose": "^4.2.8",
    "morgan": "~1.6.1",
    "serve-favicon": "~2.3.0"
  }
}

可以看到"start": "node ./bin/www",因此,启动脚本需要在终端执行

$ node bin/www

然后打开另外一个窗口,输入:

curl localhost:3000/users/test

可以看到node bin/www那端的窗口显示GET / 200 28.562 ms - 170


30.2k 声望
4.7k 粉丝
0 条评论
推荐阅读
谈谈react hooks UI与业务逻辑分离的必要性与技术方案
当前端业务复杂度上升到一定程度的时候,如何提升前端代码质量便成了老生常谈的话题。似乎前端总逃不开改他人代码,重构,修复bug的宿命。那么,我们要如何从项目代码层面,改变这一局面呢?才能保证项目A之于开...

trigkit41阅读 669

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.4k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.6k评论 10

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5k评论 9

2022大前端总结和2023就业分析
我在年前给掘金平台分享了《2022年热点技术盘点》的前端热点,算是系统性的梳理了一下我自己对前端一整年的总结。年后,在知乎上看到《前端的就业行情怎么样?》,下面都是各种唱衰前端的论调,什么裁员,外包化...

i5ting27阅读 2.2k评论 4

封面图
从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.1k评论 9

30.2k 声望
4.7k 粉丝
宣传栏