设为首页 收藏本站
查看: 876|回复: 0

[经验分享] Mongo基础使用,以及在Express项目中使用Mongoose

[复制链接]

尚未签到

发表于 2017-2-23 11:02:59 | 显示全部楼层 |阅读模式
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()查看,如下:
DSC0000.png

  
查看数据的数量:



$ 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
  先看下最终的项目结构图:
DSC0001.png


配置数据库并连接
  新建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数据

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346139-1-1.html 上篇帖子: 自制微信公众号一键排版工具 下篇帖子: 浅谈WEB前后端分离
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表