小小最近学习了Node.js 之前是一直是MongoDB,这次使用mongoose

两者的区别

对于Node.js 来说,有两种连接方式,分别是mongoDB与mongoose,这两种。这两种一个是直接连接MongoDB,一个是通过一个ORM连接mongodb。对应于ssm框架来说,属于orm层,即MyBatis层。下面本文将会着重介绍ORM层Mongoose。

mongoose是什么

Mongoose是MongoDB的一个对象封装模型。主要封装了对MongoDB文档操作的常用方法,让Node.js操作MongoDB数据库变的相当方便。

教程

下面将会开始使用mongoose

安装mongoose

这里使用npm安装mongoose 输入如下命令安装

npm install mongoose

引入mongoose

在文件中引入mongoose

var mongoose =require("mongoose");

连接mongose

使用mongoose连接数据库。

var db =mongoose.connect("mongodb://user:pass@localhost:port/database");

执行代码检查连接

这里执行代码检查连接状况。

var mongoose =require("mongoose");
var db =mongoose.connect("mongodb://127.0.0.1:27017/test");
db.connection.on("error",function (error) {
   console.log("数据库连接失败:" + error);
});
db.connection.on("open",function () {
   console.log("------数据库连接成功!------");
});

ps:这里对一些概念进行解释。。

文档

属于mongoDB的核心概念,是键值对的一个有序集,但是在js里文档被表示成对象,也是mongoDB中基本的数据单元,类比关系型数据库中的行,但是比表更加具有表现力。

集合

由一组文档组成,对比于关系型数据库来说,文档对应于行,集合就对应于一张表,

Schema

类比于Java中的model层。是定义js对象和mongodb中的文档的对象,相关联。

定义Schema

进行定义如下

    var mongoose = require("mongoose");
    var TestSchema = new mongoose.Schema({
        name: { type:String },//属性name,类型为String
        age : { type:Number, default:0},//属性age,类型为Number,默认为0
        time : { type:Date,default:Date.now },
        email: { type:String,default:''}
    });

如上所示,这里进行了相关的定义,定义js中的对象,和mongodb中的文档的对象之间的关联。

一些数据类型

对于mongodb来说有如下的数据类型。

字符串,日期,数值,布尔型,null,数组,内嵌文档。等这几种数据类型。

关于Model

这是由Schema构造生成的模型,属于Schema中的内容,具有数据库操作的行为,类似于数据库的属性,和行为的类等。

总结如下:schema定义js对象和mongodb中文档的关系,最重要的是类型相关的定义。而model,封装了对数据库的操作。例如对mongodb的增删查改都属于model相关的方法。

创建model

这里将会以schema为模型,创建model

    var db =mongoose.connect("mongodb://127.0.0.1:27017/test");
    // 创建Model
    var TestModel =db.model("test1", TestSchema);

上方创建了一个Model,以test1表明集合的名称。TestSchema表明两者之间的对应关系,进行相互的对应。其中两者关联,生成model。

Entity

这是由model创建的实体类,用于保存数据,类似于Hibernate生成的实体类。

    var TestEntity = new TestModel({
        name : "Lenka",
        age : 36,
        email: "lenka@qq.com"
    });
    console.log(TestEntity.name); // Lenka
    console.log(TestEntity.age); // 36

上方创建一个TestModel,其中传入如下的数据。

        name : "Lenka",
        age : 36,
        email: "lenka@qq.com"

其中对于对象TestEntity属于一个已经拥有数据的对象。

对其使用save方法,将会进行保存进入数据库中

TestEntity.save(function(error,doc){
        if(error){
            console.log("error:" + error);
        }else{
            console.log(doc);
        }
    });

全部代码

    var mongoose =require("mongoose");
    var db =mongoose.connect("mongodb://127.0.0.1:27017/test");
    var TestSchema = new mongoose.Schema({
        name : { type:String },
        age : { type:Number, default:0 },
        email: { type:String },
        time : { type:Date,default:Date.now }
    });
    var TestModel =db.model("test1", TestSchema );
    var TestEntity = new TestModel({
        name : "helloworld",
        age : 28,
        email:"helloworld@qq.com"
     });
    TestEntity.save(function(error,doc){
        if(error){
            console.log("error:" + error);
        }else{
            console.log(doc);
        }
    });
find查询

使用find查询相关的内容。

    Model.find({},function(error,docs){
              //若没有向find传递参数,默认的是显示所有文档
    });
    Model.find({ "age": 28 },function (error, docs) {
         if(error){
              console.log("error:" + error);
         }else{
              console.log(docs); //docs:age为28的所有文档
         }
    });

这里使用find查询相关的内容,并在回调函数中进行返回。

create 创建数据
    Model.create({name:"model_create", age:26}, function(error,doc){
         if(error) {
              console.log(error);
         } else {
              console.log(doc);
         }
   });

这里使用create创建相关的数据。

Entity.save 保存数据
    var Entity = newModel({name:"entity_save",age: 27});
    Entity.save(function(error,doc) {
          if(error) {
                console.log(error);
          } else {
                console.log(doc);
          }
     });

通过model创建entity,调用方法保存数据。

update 更新数据
       var conditions = {name : 'test_update'};
       var update = {$set : { age : 16 }};
       TestModel.update(conditions, update,function(error){
              if(error) {
                     console.log(error);
              } else {
                     console.log('Updatesuccess!');
              }
       });

这里从model获取数据,进行更新。

remove删除
    var conditions = { name: 'tom' };
    TestModel.remove(conditions,function(error){
              if(error) {
                     console.log(error);
              } else {
                     console.log('Deletesuccess!');
              }
    });
进行条件查询
  (1)使用gt(>)、gt(>)、lt(<)、lte(<=)、lte(<=)、gte(>=)操作符进行排除性的查询,如下示例:
       Model.find({"age":{"$gt":18}},function(error,docs){
           //查询所有nage大于18的数据
       });
       Model.find({"age":{"$lt":60}},function(error,docs){
           //查询所有nage小于60的数据
       });
       Model.find({"age":{"gt":18,"gt":18,"lt":60}},function(error,docs){
           //查询所有nage大于18小于60的数据
       });
  (2)$ne(!=)操作符的含义相当于不等于、不包含,查询时我们可通过它进行条件判定,具体使用方法如下:
       Model.find({ age:{$ne:24}},function(error,docs){
           //查询age不等于24的所有数据
       });
       Model.find({name:{ne:"tom"},age:{ne:"tom"},age:{gte:18}},function(error,docs){
           //查询name不等于tom、age>=18的所有数据
       });
  (3)和ne操作符相反,ne操作符相反,in相当于包含、等于,查询时查找包含于指定字段条件的数据。具体使用方法如下:
       Model.find({ age:{ $in:20}},function(error,docs){
           //查询age等于20的所有数据
       });
       Model.find({age:{$in:[20,30]}},function(error,docs){
           //可以把多个值组织成一个数组
       });
   (4)$or操作符,可以查询多个键值的任意给定值,只要满足其中一个就可返回,用于存在多个条件判定的情况下使用,如下示例:
       Model.find({"$or":[{"name":"yaya"},{"age":28}]},function(error,docs){
           //查询name为yaya或age为28的全部文档
       });
   (5)$exists操作符,可用于判断某些关键字段是否存在来进行条件查询。如下示例
       Model.find({name: {$exists:true}},function(error,docs){
           //查询所有存在name属性的文档
       });
       Model.find({telephone: {$exists:false}},function(error,docs){
           //查询所有不存在telephone属性的文档
       });
   (6)结果排序:find(Conditions,fields,options,callback);
       Model.find({},null,{sort:{age:-1}},function(err,docs){
           //查询所有数据,并按照age降序顺序返回数据docs
       });
   (7)限制数量:find(Conditions,fields,options,callback);
       Model.find({},null,{limit:20},function(err,docs){
              console.log(docs);
       });
   (8)跳过数量:find(Conditions,fields,options,callback);
       Model.find({},null,{skip:4},function(err,docs){
              console.log(docs);
       });
   (9)Schema添加属性值
       var mongoose = require('mongoose');
       var TempSchema = new mongoose.Schema;
       TempSchema.add({ name: 'String', email:'String', age: 'Number' })