小小最近学习了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(
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'?})
推荐阅读
●知新 |?Koa?框架从入门到熟练第二章
●知新 |?koa?框架从入门到熟练第一章
●了解 |?mongodb之文件存储Gridfs
●明了 |?redis高可用实现方案
小明菜市场
领取专属 10元无门槛券
私享最新 技术干货