Mongo基础使用,以及在Express项目中使用Mongoose
Posted 暖风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章
夺命雷公狗---node.js---19之项目的构建在node+express+mongo的博客项目4mongodb在项目中的基本引入
夺命雷公狗---node.js---21之项目的构建在node+express+mongo的博客项目6之数据的遍历
通过 express 从 mongo 获取数据,构建对象并发送到 React