学习
实践
活动
工具
TVP
写文章

熟悉 node.js之mongoose

小小最近学习了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高可用实现方案

小明菜市场

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200717A0ZQEN00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券