zoukankan      html  css  js  c++  java
  • 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数据

  • 相关阅读:
    SQL Server CTE 递归查询全解(转载)
    ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost
    ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (转载)
    SQL Server中比较末尾带有空格的字符串遇到的坑 (转载)
    ASP.NET Core如何设置请求超时时间
    ADO.NET的Connection Timeout和Command Timeout (转载)
    风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转
    WPF学习资源整理
    WCF 学习笔记
    WorkFlow 工作流 学习笔记
  • 原文地址:https://www.cnblogs.com/woodk/p/6155955.html
Copyright © 2011-2022 走看看