大前端之路node第(3)天:mongodb数据库工具之Mongoose

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21423689/article/details/84108756

mongoDB简介:

mongoDB与一些关系型数据库相比,它更显得轻巧、灵活,非常适合在数据规模很大、事务性不强的场合下使用。同时它也是一个对象数据库,没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储。

·由c++语言编写,是一个分布式文件存储的开源NoSQL数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。

· mongoDB旨在为web应用提供可扩展的高性能数据存储解决方案

· mongoDB将数据存储为一个文档,数据结构由键值对组成。mongoDB文档类似于JSON对象,字段值可以包含其他文档、数组及文档数组。

安装  https:www.mongodb.org/download下载安装包

安装可视化工具,如robomongo、mongovue等

mongodb的启动与连接

  - windows启动服务器端 找到mongodb的安装目录(比如是D:\mongodb),shift+右键打开命令窗口,新建一个data文件夹,在命令行中输入

    mongod --dbpath=D:\mongodb\data

    如果出现connections on port 27017就表示启动成功并在27017端口上监听了客户端的请求。--dbpath后的值表示数据库文件的存储路径,而且后面的路径必须事先创建好,必须已经存在,否则服务开启失败。另外,这个命令窗体一旦关闭就相当于停止了mongodb的服务。

  - 启动客户端连接服务器 找到mongodb的安装目录,比如D:\mongodb\bin,在该目录下打开命令行窗口,输入mongo --host=127.0.0.1或者mongo,按回车键,其中--host后的值表示服务器的ip地址,127.0.0.1表示的是本地服务器,每次数据库都会默认连接test数据库

mongodb基本概念

  ·数据库

    1,一个mongoDB可以建立多个数据库

    2,mongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

    3,数据库也通过名字来标识,数据库名可以是满足一下条件的任意utf8字符串

      - 不能是空字符串

      - 不能含有空格、.、$、/、\和\0(空字符)

      - 应全部小写

      - 最多64字节

    4, 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库

      - admin:’root‘数据库,要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限,一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器

      - local:这个数据库永远不会被复制,可以用来存储于本地单台服务器的任意集合

      - config:当mongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

  ·文档(相当于row)

    文档是mongoDB中的核心单元,可以将文档类比成关系数据库中的每一行数据。多个键及其关联的值有序的放置在一起就是文档。mongoDB使用了BSON这种结构来存储数据和网络数据交换。BSON数据可以理解为在JSON的基础上添加了一些json中没有的数据类型。

  ·集合(相当于table)

    集合就是一组文档的组合,如果将文档类比成数据库中的行,那么集合就可以类比成数据库的表。在mongoDB中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的,比如下面的两个文档可以同时存入到一个集合中

{"name":"lucy"}{"Name":"lily","sex":"女"}  注:当第一个文档插入时,集合就会被创建

  ·字段field(相当于column)

对mongoDB的基础操作

数据库的方法 help

  ·创建数据库 use database_name 注:如果数据库不存在,则创建数据库,否则切换到指定数据库

  ·查看所有数据库 show dbs 注:如果新建一个数据库没有显示,则需要向新建的数据库插入一些数据db.collection_name.insert({name:'zhangsan'})

  ·查看当前使用的数据库 db或db.getName() 注:db代表的是当前数据库

  ·删除数据库 db.dropDatabase()

  ·断开mongodb与mongodb服务的连接 exit

操作集合方法 db.worker.help()查看帮助api

  ·查看当前数据库下有哪些集合 show collections

  ·创建集合 db.createCollection("collection_name")

  ·向集合中插入文档 db.collection_name.insert(document) 注:document指要插入的文档

  ·查看集合中有多少条document数据 db.collection_name.count()

  ·删除当前数据库中的集合 db.collection_name.drop()

文档的方法

  ·插入文档 db.collection_name.insert(document) 插入文档后会自动生成一个_id号,_id的类型是ObjectId类型的

   也可以用数组的方式一次向集合中插入多条文档db.collection_name.insert([document1,document2]) 

  ·查询集合中的所有文档 db.collection_name find()

  ·使用save方法插入文档(插入或者更新),_id如果存在就更新,_id如果不存在就插入。用法与insert类似

  ·更新已经存在的文档 db.collection_name.update(<query>,<update>,{upsert:<boolean>,multi:<boolean>,writeConcern:<document>})

    - query:update的查询条件,类似sql update查询的where后面的

    - update:update的对象和一些更新的操作符(如$set,$inc...),$inc在原基础上累加后更新,$set直接更新

    - multi:可选,默认false,只更新找到的第一条记录;如果为true,就把按条件查出来的多条记录全部更新

  eg: db.worker.update({name:'zhangsan'},{$set:{name:'zhangsan123'}})

扩展

  存储在mongodb集合中的每个文档都有一个默认的主键_id,这个主键名称是固定的,它可以是mongodb支持的任何数据类型,默认是ObjectId。该类型的值由系统自己生成,从某种意义上说不会重复。mysql等关系型数据库的主键都是自增的。但在分布式环境下,这种方法不可行,会产生冲突。因此,mongoDB采用ObjectId的类型来做主键。Objectid是一个12字节的BSON类型字符串。

Mongoose

mongoose是mongoDB的一个对象模型工具,是基于node-mongodb-native开发的mongoDB的nodejs驱动,可以在异步的环境下执行。同时它也是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的一些增删改查等常用方法,让nodejs操作mongoDB数据库变得更加容易。

安装Mongoose:

//引入mongoose
var mongoose = require('mongoose');
//连接
mongoose.connect('mongodb://localhost/anyao', { useNewUrlParser: true }, function(err) {
    if (err) {
        console.log('Connection Error:' + err);
    } else {
        console.log('Connection success!');
    }

});
//监听断开
mongoose.connection.on("disconnected", function(){
    console.log("数据库断开");
});

    更多钩子移步官方文档

Mongoose核心概念

模式:

//创建模式 -->理解为建表的表头 不过这有带有属性描述的
var animalSchema = new Schema({ name: String, type: String });
/* 允许使用的SchemaTypes:
String
Number
Date
Buffer
Boolean
Mixed
ObjectId
Array */

//利用上面的表头实例化一个表出来,并且名字为Animas(默认会为你加s)
var Animal = mongoose.model('Anima', animalSchema);

//为我们的模式添加一个静态方法
animalSchema.statics.findByName = function(name, cb) {
  return this.find({
        $or : [ //多条件,数组
            {name : {$regex : name}},
            {name1 : {$regex : name}}
        ]
    },{"_id":0,"__v":0,}, cb);
};

//使用该静态方法
Animal.findByName(req.query.name, function(err, animals) {
            console.log(animals);
            let obj = {
                success: '请求成功',
                data: animals
            };
            res.send(JSON.stringify(obj));
        });

// 实例方法 define a schema-->找出一些特殊的数据给这些实例添加方法
var animalSchema = new Schema({ name: String, type: String });

// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function(cb) {
  return this.model('Animal').find({ type: this.type }, cb);
};
//现在我们所有的animal的实例有一个findsimilartypes方法可用。
var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });

dog.findSimilarTypes(function(err, dogs) {
  console.log(dogs); // woof
});


还有一些 查询助手 、查询助手 、虚拟属性等都比较简单官网看一下即可

接下来看第二个参数options:

其实就是内部给咱们封装好的一些便利条件,比如倒叙,去除某项等

//选项(Options):
new Schema({..}, options);

// or

var schema = new Schema({..});
schema.set(option, value);

options的选项大致有:

 模式了解过了就可以愉快的crud了、  

添加数据

// 方法 1
var personEntity = new personModel(obj);

personEntity.save(function (err) {  
    if (err) {
      console.log('insert failed');
    } else {
      console.log('insert success');
    }
});

// 方法 2
personModel.create(obj, function (err) {  
    if (err) {
      console.log('insert failed');
    } else {
      console.log('insert success');
    }
});

修改操作

// 方法 1
personModel.update({_phone: 222}, {$set: {_name: '把222的都改了'}}, { multi: true}, function(err){  
    if (err) { // 错误
       console.log('update failed');
    } else { // 正确
       console.log('update success');
    }
});

// 方法 2
var id = "56fc1bbe7c2bce52c38fc5f8";  
personModel.findById(id, function(err, person){  
     if (err) {
        console.log('update failed');
     } else {
        person._name = 'from_id';
        person.save(function(err){ ... });
        console.log('update success');
     }
});

查询数据

直接查询

personModel.findOne({'_phone': 111}, function (err, person) {  
    if (err) {
       console.log('select failed');
    } else {
       console.log( person );
    }
});

查询一条

var query = personModel.findOne({'_phone': 111});  
query.select();  
query.exec(function(err, person){  
     if (err) {
        console.log('select failed');
     } else {
        console.log(person);
     }
});

查询多条

//第一种
var query = personModel.find({'_phone': 222});  
query.select();  
query.exec(function(err, person){  
     if (err) {
        console.log('select failed');
     } else {
        console.log(person);
     }
});

//多类别or、这里只举一个例子 还有很多已经给出的辅助api
animalSchema.statics.findByName = function(name, cb) {
  return this.find({
        $or : [ //多条件,数组
            {name : {$regex : name}},
            {name1 : {$regex : name}}
        ]
    },{"_id":0,"__v":0,}, cb);
};

链式查询

personModel  
     .where('_phone')
     .where('_name').equals('aaa')
     .limit(2)
     .select()
     .exec(function (err, person) {
          if (err) {
              console.log('select failed');
          } else {
              console.log(person);
          }
     });

另外附详细链式查询表

personModel //model 对象  
     .find({ occupation: /host/ }) // 条件
     .where('name.last').equals('Ghost') //字段 = 值
     .where('age').gt(17).lt(66) // 范围
     .where('likes').in(['vaporizing', 'talking']) // 范围
     .limit(10) // 查几条
     .skip(20) // 跳过几条
     .asc('age') // 排序
     .sort('-occupation')
     .slaveOk()
     .hint({ age: 1, name: 1 })
     .select('name occupation') // 执行查询 () 中的值可以省略, 只是别名
     .exec(callback); // 回调函数, 处理查询结果

删除操作

//删除逻辑一定要对  小心删库跑路。。
var personEntity = new personModel();  
let selobg={_id:"56fc281ab64732d8c33b4db7"};
personModel.remove(selobg, function (err) {  
     if (err) {
       console.log('delete failed');
     } else {
       console.log('detete success');
     }
});

到这就可以愉快的建表了、入门了。

相关完整文档:

翻译文档    源文档

后面更一些其他操作,操作流文件与使用第三方插件等   

猜你喜欢

转载自blog.csdn.net/qq_21423689/article/details/84108756