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两行)
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('./config/mongoose.js');
var db = mongoose();
var index = require('./routes/index');
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
var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var User = mongoose.model('User');
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
router.get('/test', function(req, res, next) {
var user = new User({
uid: 1,
username: 'nuanfeng'
})
user.save(function(err){
if(err) {
res.end('Error');
return next();
}
User.find({}, function(err, docs) {
if(err) {
res.end('Error');
return next();
}
res.json(docs);
})
})
})
module.exports = router;
运行node查看效果
$ node bin/www
然后在浏览器中访问:http://localhost:3000/users/test,就能往数据库中存入一条记录,并在当前页面返回它的json数据
Mongo基础使用,以及在Express项目中使用Mongoose的更多相关文章
- 在express项目中使用formidable & multiparty实现文件上传
安装 formidable,multiparty 模块 npm install formidable,multiparty –save -d 表单上传 <form id="addFor ...
- 在express项目中使用redis
在express项目中使用redis 准备工作 安装redis 安装redis桌面管理工具:Redis Desktop Manager 项目中安装redis:npm install redis 开始使 ...
- thinkjs项目中使用mongoose需要注意的地方
原文链接thinkjs项目中使用mongoose需要注意的地方 由于thinkjs不支持mongodb的关联模型查询,所以我不得不使用mongoose这个第三方odm. 我有两个选择,一是像我在exp ...
- 【转】在Express项目中使用Handlebars模板引擎
原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...
- 在express项目中有效组织和使用mongoose
平凡之路 1.创建express项目 express mongooseExpress 2.最简express var express = require("express"); v ...
- 浅谈 OneAPM 在 express 项目中的实践
[编者按]OneAPM 运营团队,近日在 github 上发现了一篇文章,特别奉献给大家.本文作者王宇先生从2015年年初就开始使用我们的产品,也是OneAPM 的忠实用户. OneAPM 是一个优秀 ...
- salesforce零基础学习(九十)项目中的零碎知识点小总结(三)
本次的内容其实大部分人都遇到过,也知道解决方案.但是因为没有牢记于心,导致问题再次出现还是花费了一点时间去排查了原因.在此记录下来,好记性不如烂笔头,争取下次发现类似的现象可以直接就知道原因.废话少说 ...
- 夺命雷公狗---node.js---19之项目的构建在node+express+mongo的博客项目4mongodb在项目中的基本引入
首先我们在命令行下先建立这个库: 然后我们在项目中引入mongodb的模块: var MongoClient = require('mongodb').MongoClient; var DB_STR ...
- Jquery和Javascript 实际项目中写法基础-弹出窗和弹出层 (4)
一.实际项目中有很多如下界面效果. 二.该效果可以归结为弹出窗或者弹出层来实现的,为什么这么说?看如下代码: <!DOCTYPE html> <html> & ...
随机推荐
- RandHelper
/// <summary> /// 类说明:RandHelper类,用来实现取随机 /// 编码日期:2015-12-29 /// 编 码 人:里程碑 /// 修改日期:2015-12-2 ...
- C#面向对象设计模式纵横谈——1.面向对象设计模式与原则
一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...
- 【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 609 Solved: 318[Submit][Status][Di ...
- javascript中针对float的ceil及floor
function floorFloat(num, precision) { return +(Math.floor(+(num + 'e' + (precision))) + 'e' + -(prec ...
- C# 扩展系统类方法
1.声明扩展方法的步骤:类必须是static,方法是static 2.第一个参数是被扩展的对象,前面标注this 3.使用扩展方法的时候必须保证扩展方法类已经在当前代码中using 例子:using ...
- iife js
摘自:http://dz.sdut.edu.cn/blog/subaochen/2016/02/%E8%AF%B4%E4%B8%80%E8%AF%B4js%E7%9A%84iife/ 1 定义 IIF ...
- 查看Mysql版本号 (最简单的是status )
一.使用命令行模式进入mysql会看到最开始的提示符;二.命令行中使用status可以看到;三.使用系统函数等等, 查看版本信息 #1使用命令行模式进入mysql会看到最开始的提示符 Your M ...
- iOS无限循环滚动scrollview
经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...
- js 中关联数组
以前都不知道这种写法叫做关联数组. 何为关联数组呢.通常的数组在填充时会隐式或者显示指定数组下标,但JS中数组可以以名字的形式为元素赋值,这就形成了关联数组. 例子 var p={ name:'dai ...
- label中设置某些指定的字体的属性设置(Color,Size,FontColor)
不知道大家有没有遇到要设置某些字体的颜色和大小等属性的设置,下面就让我们一起走进字体的变形王国吧!!! 1.在storyboard中拖一个控件label,拖线设置属性为: @property (wea ...