首页 > 代码库 > Mongo基础使用,以及在Express项目中使用Mongoose

Mongo基础使用,以及在Express项目中使用Mongoose

MongoDB的基本使用

MongoDB特点:

  • 使用BSON存储数据
  • 支持相对丰富的查询操作(相对其他nosql数据库)
  • 支持索引
  • 副本集(支持多个实例/多个服务器运行同个数据库)
  • 分片(数据库水平扩展)
  • 无模式(同个数据文档中的数据可以不一样)
  • 部署简单方便(默认无密码,也带来安全问题)

服务的启动:

mongod

(此前需要安装了mongo数据库,并创建过mongodb的目录:$ mkdir -p /data/db)

启动mongodb后,可以使用mongo命令行来操作数据库,或使用Robomongo这样的GUI客户端。

Mongo命令行工具操作MongoDB:

使用一个数据库:(mongodb不需要预先创建数据库,当给一个数据库写入内容时会自动创建)

$ use mytest

插入数据(给mytest数据库下的users集合插入一条文档)

$ db.users.insert({"username": "nuanfeng"})

然后可以查看数据库和集合:

$ show dbs$ show collections

查看users集合中的所有文档:

$ db.users.find()

再添加一条数据:(mongodb是无模式的,所以可以添加不同格式的数据)

$ db.users.insert({"username": "Zoe", "group": "reporter"})

再用db.users.find()查看,如下:

技术分享


查看数据的数量:

$ db.users.find().count()

根据id查询数据:

$ db.users.find({"_id": ObjectId("584bc73ea635e489676cf5db")})

更新数据: (匹配到的第一条)

$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}})

更新数据: (匹配到的所有)

$ db.users.update({"username": "Zoe"}, {$set: {"group": "writer"}}, {multi: true})

用save()也可以修改数据:(必须根据‘_id’,会直接替换掉原来的数据)

db.users.save({"_id": ObjectId("584bc73ea635e489676cf5db"), "group": "reporter"})

删除满足条件的所有:

$ db.users.remove({"group": "reporter"});

删除满足条件的第一条:

$ db.users.remove({"group": "reporter"}, true);

删除集合中的所有文档:

$ db.users.remove({})

删除整个集合(所有文档和索引)

$ db.users.drop()

 

使用Mongoose模块操作MongoDB

模块介绍

Mongoose是将nodejs的对象和MongoDB中的文档对应的一个模块。

Mongoose既支持强模式,也支持无模式。

安装mongoose:

$ npm install mongoose

先看一下最终的目录结构:

配置与链接

链接的格式:(也可以省略用户名、密码、端口号)

var uri = ‘mongodb://username:password@hostname:port/databasename‘mongoose.connect(uri);

Model与Schema

Model使nodejs对象和MongoDB中的文档相对应,Schema实现了Model的数据类型和结构的定义,从而在无模式的MongoDB中实现了模式化的存储

model.js

/** 配置并链接MongoDB **/var mongoose = require(‘mongoose‘);var uri = ‘mongodb://localhost/mongoose-base‘;mongoose.connect(uri);/** 创建Schema、创建Model **/var BookSchema = new mongoose.Schema({    name: String,    author: String,    publishTime: Date});mongoose.model(‘Book‘, BookSchema);

创建文档

insert.js

var mongoose = require(‘mongoose‘);require(‘./model.js‘);/** 获取Model,创建Book的实例 Entity **/var Book = mongoose.model(‘Book‘);var book = new Book({  name: ‘MEAN Web Develop‘,  author: ‘Green‘,  publishTime: new Date()});book.author = ‘Jim‘;    // 参数可以重新指定/** 插入数据 **/book.save(function(err) {    // 执行保存,并查看返回情况    console.log(‘save status:‘, err ? ‘failed‘ : ‘success‘);})

简单查询

find.js

var mongoose = require(‘mongoose‘);require(‘./model.js‘);var Book = mongoose.model(‘Book‘);/** 查询所有数据 **/Book.find({}, function(err, docs) {  if (err) {    console.log(‘err:‘, err);    return;  }  console.log(docs)})

findOne.js

var mongoose = require(‘mongoose‘);require(‘./model.js‘);var Book = mongoose.model(‘Book‘);/** 查询一条数据,并修改 **/Book.findOne({author: ‘Jim‘}, function(err, doc) {  if (err) {    console.log(‘err:‘, err);    return;  }  doc.author = ‘James‘;  doc.save();  console.log(‘findOne result:‘, doc)})

删除文档

remove.js

var mongoose = require(‘mongoose‘);require(‘./model.js‘);var Book = mongoose.model(‘Book‘);Book.findOne({ author: ‘Jim‘ }, function(err, doc) {  if (err) {    console.log(‘findOne err:‘, err);    return;  }  if (doc) {    doc.remove();  }})

条件语句

var mongoose = require(‘mongoose‘);require(‘./model.js‘);var Book = mongoose.model(‘Book‘);var cond = {    $or: [        {author: ‘Jim‘},        {author: ‘James‘}    ]};Book.find(cond, function(err, docs){    if(err) {        console.log(‘find by cond err:‘, err);    }    console.log(‘cond:‘, cond, ‘result:‘, docs);})

 

在Express项目中使用Mongoose

快速生成express应用

这里我们用express-generator来快速生成express应用(先安装好node、npm、express-generator、mongodb)

$ express mongooseExpress

先看下最终的项目结构图:

技术分享

配置数据库并连接

新建config文件夹,用来放置数据库配置信息

config/config.js

module.exports = {    mongodb: ‘mongodb://localhost:27017/mongoose-test‘}

config/mongoose.js

var mongoose = require(‘mongoose‘);var config = require(‘./config.js‘);module.exports = function() {    var db = mongoose.connect(config.mongodb);    require(‘../models/user.server.model.js‘);    return db;}

全局引入mongoose

在app.js的路由模块前引用刚才创建的mongoose配置信息(8,9两行)

 1 var express = require(‘express‘); 2 var path = require(‘path‘); 3 var favicon = require(‘serve-favicon‘); 4 var logger = require(‘morgan‘); 5 var cookieParser = require(‘cookie-parser‘); 6 var bodyParser = require(‘body-parser‘); 7  8 var mongoose = require(‘./config/mongoose.js‘); 9 var db = mongoose();10 11 var index = require(‘./routes/index‘);12 var users = require(‘./routes/users‘); 

创建Schema和Model

新建models文件夹

/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);

编写数据库处理逻辑代码

我们直接在users路由模块中加入数据库存取操作的代码

/routes/users.js

 1 var express = require(‘express‘); 2 var router = express.Router(); 3  4 var mongoose = require(‘mongoose‘); 5 var User = mongoose.model(‘User‘); 6  7 /* GET users listing. */ 8 router.get(‘/‘, function(req, res, next) { 9   res.send(‘respond with a resource‘);10 });11 12 router.get(‘/test‘, function(req, res, next) {13     var user = new User({14         uid: 1,15         username: ‘nuanfeng‘16     })17 18     user.save(function(err){19         if(err) {20             res.end(‘Error‘);21             return next();22         }23 24         User.find({}, function(err, docs) {25             if(err) {26                 res.end(‘Error‘);27                 return next();28             }29 30             res.json(docs);31         })32     })33 })34 35 module.exports = router;

运行node查看效果

$ node bin/www

然后在浏览器中访问:http://localhost:3000/users/test,就能往数据库中存入一条记录,并在当前页面返回它的json数据

Mongo基础使用,以及在Express项目中使用Mongoose