小小最近学习了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元无门槛券
私享最新 技术干货