一:参考学习网址
npm: https://www.npmjs.com/package/mongoose
官网API:http://mongoosejs.com/docs/guide.html
二:在node中的连接
1.先要安装mongoose: npm i mongoose --save
2.如何连接:
var mongoose = require('mongoose');
//连接
mongoose.connect( ' 地址 ' ) //自己需要连接的数据库地址,如本机的test数据库,就是 mongoose.connect('mongodb://localhost/test')
var db = mongoose.connection;
//连接成功
db.on('connected', function () { console.log('Mongoose connection open to ' + DB_URL); });
//连接异常
db.on('error',function (err) { console.log('Mongoose connection error: ' + err); }); //连接断开 db.on('disconnected', function () { console.log('Mongoose connection disconnected'); }); module.exports = mongoose;
三:关于Schema
mongoose基本由Schema , Model , query 组成;
1.Schema的作用:
来定义表数据中的字段;
和字段的类型;
和字段的一些限定,例如长度......;
和数据库的一些静态方法;
2.Schema的创建方式:
var UserSche = new mongoose.Schema( option ) ;
2.1. Schema的参数option:
这些参数的作用主要是在创建数据表之前,对立面的字段的一些控制,和一些属性的配置,如下面是基本完整的所有的参数的配置:
var schema3 = new Schema({ test: { type: String, //类型 lowercase: true, // 总是将test的值转化为小写 uppercase: true, // 总是将test的值转化为大写 required:true, //设定是否必填 default:'star', //设定默认值 index:true, //设定索引值 unique:true, //索引值唯一 sparse:true, //是否启用稀疏索引 //一般用在LBS地理位置应用中 match:RegExp, //判断是否通过正则验证 enum:Array, //判断test值是否包含于enmu对应的数组中 min:Number, //判断对应值是否大于等于给定值 max:Number, //判断对应值是否小于等于给定值 trim:true //去除数据前后的空格 capped:1024 //限定大小最大为1024字节 validate:function,为此属性添加一个验证器函数,如demo1所示 get:function,//为这个属性定义一个定制的getter Object.defineProperty()。如demo2所示 set:function,//定义此属性的自定义设置Object.defineProperty()。如demo2所示 } });
//var schema3 = new Schema({ haha:{ type : String } }) //这是最基本的
demo2:
//将传入的值四舍五入后存储 var numberSchema = new Schema({ integerOnly: { type: Number, get: v => Math.round(v), set: v => Math.round(v), require:true } });
2.2.Schema的option中的type可配置的参数:
//如果在Schema中字段不给类型的话就会,自动默认为混合类型Mixed
String //字符串类型 Number //数字类型 Date //日期类型 Boolean //布尔类型 Buffer ObjectId Mixed //混合类型 Array //数组类型
2.2.1.几种特殊类型的声明:
//1.ObjectId UserSche. add ( { //schema的add方法是在之前new的基础上再添加字段 owner : mongoose.Schema.Types.ObjectId }); /*2.Mixed: 这个是混合类型; 里面可以放置任何类型 的数据;*/ UserSchema . add ( {//第一种创建方式: owner : { } }); UserSchema . add ( {//第二种创建方式: owner : mongoose.Schema.Types.Mixed }); //3.Array: UserSchema . add ( {//第一种创建简单数组: owner : [ String ] }); var moreSchema = new mongoose.Schema( {//第二种复杂类型数组创建: email : String , Verified : Boolean }); //在这里创建这个Schema来保存一些类型 UserSchema . add ( { owner : [ moreSchema ] //把上面的Schema类型用在数组里面 });
2.3.Schema 创建静态方法
2.3.1.作用:这个静态方法可以用在Model中直接调用,需要先声明Schema实例
2.3.2.用法例子:
UserSchema.statics.findById = function( id , callback) { this.find ( { ID : id } };
四:关于Model
4.1.作用:Model是由Schema生成的Model;可以对数据库进行直接操作;
4.2.插入数据:
var user = mongoose.model ('user' ,UseSch); //UseSch是在前面声明的Schema var users = new user( { username : "liu", password : 123123, phone : 1111111 }) ; user.save( function ( err ,res) { if(err) { console.log(err); }else{ console.log(res); } }); //后面可以通过query的点式操作来操作数据库,看起来更简洁
4.3更新数据:
4.3.1.普通更新,根据条件更新所有的
//Model.update( 条件 , 更新项 , 回调函数 ) var str = {'username' : 'liu'}; var upsrt = {'userpwd': '666'}; User.update(str, upsrt, function(err, res){ if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } })
4.3.2.通过id更新一条
Model.findByIdAndUpdate(id, [update], [options], [callback])
4.3.3.找到一条并更新
Model.findOneAndUpdate([conditions], [update], [options], [callback])
4.4.删除数据:
4.4.1.普通删除所有符合条件的
Model.remove(conditions, [callback])
4.4.2.通过id查到并且删除
Model.findByIdAndRemove(id, [options], [callback])
4.4.3.只找到第一个符合条件的并且删除
Model.findOneAndRemove(conditions, [options], [callback])
4.5.查询
4.5.1.条件查询
//条件查询: Model.find(conditions, [fields], [options], [callback]) /*Model.find( 查询条件 , 需要展示的 字段如果是null就表示返回所有的字段 , 对查询出来的数据进行再次筛选 , [callback])*/
4.5.1.1.一般条件查询
User.find({'name', 'liu'}, 'name email',function(err, result) { //查询到所有这个表里面的名字是‘liu’ 的数据 //并且只展示字段name 和 email 别的不要 console.log(result) //返回包含上面两个字段的符合条件的数据 });
4.5.1.2.再筛选查询
参数3: User.find({'name', 'liu'}, 'name email', {skip: 0, limit: 4, sort: {ID: 1}}, function(err, result) { //查询到name是‘liu’ 的前4条,用ID进行正序排序的包含name ,email的数据 console.log(result); });
4.5.1.3.某个范围查询
User.find( { age : {$gte:21 ,$lte:26} } , function( err, result ) { //查到user表的年龄在 21 - 26 之间的数据 console.log(result) })
规定范围的方法还有:
$or 或关系 $nor 或关系取反 $gt 大于 $gte 大于等于 $lt 小于 $lte 小于等于 $ne 不等于 $in 在多个值范围内 $nin 不在多个值范围内 $all 匹配数组中多个值 $regex 正则,用于模糊查询 $size 匹配数组大小 $maxDistance 范围查询,距离(基于LBS) $mod 取模运算 $near 邻域查询,查询附近的位置(基于LBS) $exists 字段是否存在 $elemMatch 匹配内数组内的元素 $within 范围查询(基于LBS) $box 范围查询,矩形范围(基于LBS) $center 范围醒询,圆形范围(基于LBS) $centerSphere 范围查询,球形范围(基于LBS) $slice 查询字段集合中的元素(比如从第几个之后,第N到第M个元素)
4.5.2.数量查询 :Model.count(conditions, [callback]) ;
4.5.3.根据id查询 : Model.findById(id, [fields], [options], [callback]) ;
4.5.4.模糊查询 : 主要是用的正则 $regex 来模糊匹配
var whereStr = {'username':{$regex:/m/i}}; User.find(whereStr, function(err, res){ if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) //找到所有名字中带有m的数据
4.5.4.分页查询
function getByPager(){ var pageSize = 5; //一页多少条 var currentPage = 1; //当前第几页 var sort = {'logindate':-1}; //排序(按登录时间倒序) var condition = {}; //条件 var skipnum = (currentPage - 1) * pageSize; //跳过数 User.find(condition).skip(skipnum).limit(pageSize).sort(sort).exec(function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) }
4.5.6.去重查找 :
Model.distinct(field, [conditions], [callback]) ;
4.5.7.只查一条数据 :
Model.findOne(conditions, [fields], [options], [callback]) ;
五:query
点式操作: Person. find({ occupation: /host/, 'name.last': 'Ghost', age: { $gt: 17, $lt: 66 }, likes: { $in: ['vaporizing', 'talking'] } }). limit(10). sort({ occupation: -1 }). select({ name: 1, occupation: 1 }). exec(callback);