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的更多相关文章

  1. 在express项目中使用formidable & multiparty实现文件上传

    安装 formidable,multiparty 模块 npm install formidable,multiparty –save -d 表单上传 <form id="addFor ...

  2. 在express项目中使用redis

    在express项目中使用redis 准备工作 安装redis 安装redis桌面管理工具:Redis Desktop Manager 项目中安装redis:npm install redis 开始使 ...

  3. thinkjs项目中使用mongoose需要注意的地方

    原文链接thinkjs项目中使用mongoose需要注意的地方 由于thinkjs不支持mongodb的关联模型查询,所以我不得不使用mongoose这个第三方odm. 我有两个选择,一是像我在exp ...

  4. 【转】在Express项目中使用Handlebars模板引擎

    原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...

  5. 在express项目中有效组织和使用mongoose

    平凡之路 1.创建express项目 express mongooseExpress 2.最简express var express = require("express"); v ...

  6. 浅谈 OneAPM 在 express 项目中的实践

    [编者按]OneAPM 运营团队,近日在 github 上发现了一篇文章,特别奉献给大家.本文作者王宇先生从2015年年初就开始使用我们的产品,也是OneAPM 的忠实用户. OneAPM 是一个优秀 ...

  7. salesforce零基础学习(九十)项目中的零碎知识点小总结(三)

    本次的内容其实大部分人都遇到过,也知道解决方案.但是因为没有牢记于心,导致问题再次出现还是花费了一点时间去排查了原因.在此记录下来,好记性不如烂笔头,争取下次发现类似的现象可以直接就知道原因.废话少说 ...

  8. 夺命雷公狗---node.js---19之项目的构建在node+express+mongo的博客项目4mongodb在项目中的基本引入

    首先我们在命令行下先建立这个库: 然后我们在项目中引入mongodb的模块: var MongoClient = require('mongodb').MongoClient; var DB_STR ...

  9. Jquery和Javascript 实际项目中写法基础-弹出窗和弹出层 (4)

     一.实际项目中有很多如下界面效果.    二.该效果可以归结为弹出窗或者弹出层来实现的,为什么这么说?看如下代码:      <!DOCTYPE html> <html> & ...

随机推荐

  1. LISA介绍及其使用方法

    LISA是ARM公司开发的一款开源工具.在内核开发过程中,苦于无法针对修改内容进行一些量化或者可视化结果的测量,而无感.LISA对于模型调优,回归测试都有较强的支持. 什么是LISA? LISA是Li ...

  2. 调用altera IP核的仿真流程—上

    调用altera IP核的仿真流程—上 在学习本节内容之后,请详细阅读<基于modelsim-SE的简单仿真流程>,因为本节是基于<基于modelsim-SE的简单仿真流程>的 ...

  3. A*算法

    A*在游戏设计中有它很典型的用法,是人工智能在游戏中的代表. A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚 A*算法,我看还是先说说何谓启发式算法. 一.何谓启发式搜索算法: 在说它之前 ...

  4. asp.net页面生命周期

    Asp.Net页面生命周期 本文转载自:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html 一.什么是Asp.Net页面生命周期 当 ...

  5. Unity Animator动画状态机 深入理解(二)IK控制

    IK还是一个很神奇和实用的东西啊,起码可以用代码来控制人物骨骼位置还是很爽的.因为不是动画师~ 这篇可能跟Animator没啥关系了哈,都是代码层的. 看了一官方的案例,老的,有些问题,自己修改了一下 ...

  6. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  7. Linux的3个文件时间

    文件的三个时间相信大家都已经很熟悉windows操作系统了,当我们在windows系统下创建一个文件时,系统同时会为这个文件建立相关的参数去描述这个文件,如图: 这些参数包括文件的大小,文件类型,位置 ...

  8. ionic ios iframe 白屏

    之前碰到一个问题: 在ios下边使用iframe出现白屏问题 android下边正常 原因是ios对app打开外部网页有限制需要取消限制 解决方法 1.确认添加whitelist 插件 2.在conf ...

  9. String、StringBuffer与StringBuilder之间区别

    关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder >  String ...

  10. Python Day20

    Django 表操作 1.基本操作 # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # o ...