一:参考学习网址

npm: https://www.npmjs.com/package/mongoose

官网API:http://mongoosejs.com/docs/guide.html

二:在node中的连接

1.先要安装mongoose: npm i mongoose --save

2.如何连接:

  1.  

var mongoose = require('mongoose');

//连接

mongoose.connect( ' 地址 ' )  //自己需要连接的数据库地址,如本机的test数据库,就是 mongoose.connect('mongodb://localhost/test')

var db = mongoose.connection;

  1. //连接成功
  1. db.on('connected', function () { console.log('Mongoose connection open to ' + DB_URL); });
  1. //连接异常
  1. db.on('error',function (err) { console.log('Mongoose connection error: ' + err); });
  2. //连接断开
  3. db.on('disconnected', function () { console.log('Mongoose connection disconnected'); });
  4. module.exports = mongoose;

三:关于Schema

mongoose基本由Schema , Model , query 组成;

1.Schema的作用:

  来定义表数据中的字段;
  和字段的类型;
  和字段的一些限定,例如长度......;
  和数据库的一些静态方法;

2.Schema的创建方式:

  var UserSche = new mongoose.Schema( option ) ;

  2.1. Schema的参数option:

    这些参数的作用主要是在创建数据表之前,对立面的字段的一些控制,和一些属性的配置,如下面是基本完整的所有的参数的配置:

  1. var schema3 = new Schema({
  2.     test: {
  3.     type: String, //类型
  4.     lowercase: true, // 总是将test的值转化为小写
  5.     uppercase: true, // 总是将test的值转化为大写
  6.     required:true, //设定是否必填
  7.     default:'star', //设定默认值
  8.     indextrue, //设定索引值
  9.     uniquetrue, //索引值唯一
  10.     sparsetrue, //是否启用稀疏索引 //一般用在LBS地理位置应用中
  11.     matchRegExp, //判断是否通过正则验证
  12.     enumArray //判断test值是否包含于enmu对应的数组中
  13.     minNumber //判断对应值是否大于等于给定值
  14.     maxNumber //判断对应值是否小于等于给定值
  15.     trim:true //去除数据前后的空格
  16.     capped:1024 //限定大小最大为1024字节
  17.     validatefunction,为此属性添加一个验证器函数,如demo1所示
  18.     getfunction//为这个属性定义一个定制的getter Object.defineProperty()。如demo2所示
  19.     setfunction//定义此属性的自定义设置Object.defineProperty()。如demo2所示
  20.     }
  21.     });
  1.           //var schema3 = new Schema({ haha:{ type : String } }) //这是最基本的
  1.  
  1.  
  1.  
  1.  

    demo2:

  1. //将传入的值四舍五入后存储
  2. var numberSchema = new Schema({
  3. integerOnly: {
  4. type: Number,
  5. get: v => Math.round(v),
  6. set: v => Math.round(v),
  7. require:true
  8. }
  9. });

   2.2.Schema的option中的type可配置的参数:

  1. //如果在Schema中字段不给类型的话就会,自动默认为混合类型Mixed
  1. String //字符串类型
  2. Number //数字类型
  3. Date //日期类型
  4. Boolean //布尔类型
  5. Buffer
  6. ObjectId
  7. Mixed //混合类型
  8. Array //数组类型

      2.2.1.几种特殊类型的声明:

  1. //1.ObjectId
  2. UserSche. add ( { //schema的add方法是在之前new的基础上再添加字段
  3. owner : mongoose.Schema.Types.ObjectId
  4. });
  5.  
  6. /*2.Mixed:
  7. 这个是混合类型;
  8. 里面可以放置任何类型
  9. 的数据;*/
  10.  
  11. UserSchema . add ( {//第一种创建方式:
  12. owner : { }
  13. });
  14.  
  15. UserSchema . add ( {//第二种创建方式:
  16. owner : mongoose.Schema.Types.Mixed
  17. });
  18.  
  19. //3.Array:
  20. UserSchema . add ( {//第一种创建简单数组:
  21. owner : [ String ]
  22. });
  23.  
  24. var moreSchema = new mongoose.Schema( {//第二种复杂类型数组创建:
  25. email : String ,
  26. Verified : Boolean
  27. }); //在这里创建这个Schema来保存一些类型
  28.  
  29. UserSchema . add ( {
  30. owner : [ moreSchema ] //把上面的Schema类型用在数组里面
  31. });

    2.3.Schema 创建静态方法

      2.3.1.作用:这个静态方法可以用在Model中直接调用,需要先声明Schema实例

      2.3.2.用法例子:

  1. UserSchema.statics.findById = function( id , callback) {
  2. this.find ( { ID : id }
  3. };

四:关于Model

  4.1.作用:Model是由Schema生成的Model;可以对数据库进行直接操作;

  4.2.插入数据:

  1. var user = mongoose.model ('user' ,UseSch); //UseSch是在前面声明的Schema
  2.  
  3. var users = new user( {
  4. username : "liu",
  5. password : 123123,
  6. phone : 1111111
  7. }) ;
  8. user.save( function ( err ,res) {
  9. if(err) {
  10. console.log(err);
  11. }else{
  12. console.log(res);
  13. }
  14. }); //后面可以通过query的点式操作来操作数据库,看起来更简洁

  4.3更新数据:

    4.3.1.普通更新,根据条件更新所有的

  1. //Model.update( 条件 , 更新项 , 回调函数 )
  2. var str = {'username' : 'liu'};
  3. var upsrt = {'userpwd': '666'};
  4. User.update(str, upsrt, function(err, res){
  5. if (err) {
  6. console.log("Error:" + err);
  7. }
  8. else {
  9. console.log("Res:" + res);
  10. }
  11. })

    4.3.2.通过id更新一条

  1. Model.findByIdAndUpdate(id, [update], [options], [callback])

    4.3.3.找到一条并更新

  1. Model.findOneAndUpdate([conditions], [update], [options], [callback])  

  4.4.删除数据:

    4.4.1.普通删除所有符合条件的

  1. Model.remove(conditions, [callback])

    4.4.2.通过id查到并且删除

  1. Model.findByIdAndRemove(id, [options], [callback])   

    4.4.3.只找到第一个符合条件的并且删除

  1. Model.findOneAndRemove(conditions, [options], [callback])

  4.5.查询

    4.5.1.条件查询

  1. //条件查询:
  2. Model.find(conditions, [fields], [options], [callback])
  3.  
  4. /*Model.find( 查询条件 , 需要展示的
  5. 字段如果是null就表示返回所有的字段 ,
  6. 对查询出来的数据进行再次筛选 , [callback])*/

      4.5.1.1.一般条件查询

  1. User.find({'name', 'liu'}, 'name email',function(err, result) {
  2. //查询到所有这个表里面的名字是‘liu’ 的数据
  3. //并且只展示字段name 和 email 别的不要
  4. console.log(result) //返回包含上面两个字段的符合条件的数据
  5.  
  6. });

      4.5.1.2.再筛选查询

  1. 参数3
  2. User.find({'name', 'liu'}, 'name email', {skip: 0, limit: 4, sort: {ID: 1}}, function(err, result) {
  3.  
  4. //查询到name是‘liu’ 的前4条,用ID进行正序排序的包含name ,email的数据
  5. console.log(result);
  6. });

      4.5.1.3.某个范围查询

  1. User.find( { age : {$gte:21 ,$lte:26} } , function( err, result ) {
  2. //查到user表的年龄在 21 - 26 之间的数据
  3. console.log(result)
  4. })

      规定范围的方法还有:

  1. $or    或关系
  2. $nor    或关系取反
  3. $gt    大于
  4. $gte    大于等于
  5. $lt     小于
  6. $lte    小于等于
  7. $ne 不等于
  8. $in 在多个值范围内
  9. $nin 不在多个值范围内
  10. $all 匹配数组中多个值
  11. $regex  正则,用于模糊查询
  12. $size   匹配数组大小
  13. $maxDistance  范围查询,距离(基于LBS
  14. $mod   取模运算
  15. $near   邻域查询,查询附近的位置(基于LBS
  16. $exists   字段是否存在
  17. $elemMatch  匹配内数组内的元素
  18. $within  范围查询(基于LBS
  19. $box    范围查询,矩形范围(基于LBS
  20. $center 范围醒询,圆形范围(基于LBS
  21. $centerSphere  范围查询,球形范围(基于LBS
  22. $slice    查询字段集合中的元素(比如从第几个之后,第N到第M个元素)

    4.5.2.数量查询 :Model.count(conditions, [callback]) ;

    4.5.3.根据id查询 : Model.findById(id, [fields], [options], [callback]) ;

    4.5.4.模糊查询 : 主要是用的正则 $regex 来模糊匹配

  1. var whereStr = {'username':{$regex:/m/i}};
  2. User.find(whereStr, function(err, res){
  3. if (err) {
  4. console.log("Error:" + err);
  5. }
  6. else {
  7. console.log("Res:" + res);
  8. }
  9. }) //找到所有名字中带有m的数据

    4.5.4.分页查询

  1. function getByPager(){
  2. var pageSize = 5; //一页多少条
  3. var currentPage = 1; //当前第几页
  4. var sort = {'logindate':-1}; //排序(按登录时间倒序)
  5. var condition = {}; //条件
  6. var skipnum = (currentPage - 1) * pageSize; //跳过数
  7.  
  8. User.find(condition).skip(skipnum).limit(pageSize).sort(sort).exec(function (err, res) {
  9. if (err) {
  10. console.log("Error:" + err);
  11. }
  12. else {
  13. console.log("Res:" + res);
  14. }
  15. })
  16. }

    4.5.6.去重查找 : Model.distinct(field, [conditions], [callback]) ;

    4.5.7.只查一条数据 : Model.findOne(conditions, [fields], [options], [callback]) ;

五:query

  1. 点式操作:
  2. Person.
  3. find({
  4. occupation: /host/,
  5. 'name.last': 'Ghost',
  6. age: { $gt: 17, $lt: 66 },
  7. likes: { $in: ['vaporizing', 'talking'] }
  8. }).
  9. limit(10).
  10. sort({ occupation: -1 }).
  11. select({ name: 1, occupation: 1 }).
  12. exec(callback);

mongoose整理笔记的更多相关文章

  1. canvas学习之API整理笔记(二)

    前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...

  2. xmpp整理笔记:发送图片信息和声音信息

    图片和音频文件发送的基本思路就是: 先将图片转化成二进制文件,然后将二进制文件进行base64编码,编码后成字符串.在即将发送的message内添加一个子节点,节点的stringValue(节点的值) ...

  3. xmpp整理笔记:聊天信息的发送与显示

    任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示 往期回顾: xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubilit ...

  4. xmpp整理笔记:用户网络连接及好友的管理

    xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中, ...

  5. xmpp整理笔记:xmppFramework框架的导入和介绍

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...

  6. jQuery整理笔记文件夹

    jQuery整理笔记文件夹 jQuery整理笔记一----jQuery開始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔 ...

  7. sk_buff整理笔记(两、操作函数)

    承接上一:sk_buff 整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针各自是:head.data.tai ...

  8. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  9. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

随机推荐

  1. saveLayerAlpha简单入门

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.*; imp ...

  2. ABAP Memory ID

    转自:https://blog.csdn.net/lyq123333321/article/details/52659114 (一)          Difference Between SAP a ...

  3. CentOS安装文件共享samba

    参考:https://jingyan.baidu.com/article/03b2f78cdf811c5ea237aebc.html https://www.linuxidc.com/Linux/20 ...

  4. eclipse 解决POM文件错误:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

    解决方案: 更新eclipse中的maven插件 1.1 Help -> Install New Software -> Add 1.2 Location中输入 http://repo1. ...

  5. laravel的workflow流程插件

    原文地址:https://github.com/brexis/laravel-workflow

  6. react做的简单的购物车

    ###第一步 :首先电脑上已经安装react的脚手架 cnpm  install    create-react-app   -g ###第二步 :创建项目 creact-react-app   项目 ...

  7. 基本 Java Bean

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  8. nginx+keepalived互为主主高可用配置

    和nginx主从安装配置都一样   就是配置文件 多加个vip  里面具体要改的 请看下面的配置文件 直接master1上keepalived.conf配置文件内容: ! Configuration ...

  9. Python 面向对象总结

    面向对象 类 class 类型 类变量 实例方法 init attack bite 类指针 - 指向父类 对象 对象指针 实例变量 self.name slef.age 组合 一个对象作为一个属性 s ...

  10. Python2 中字典实现的分析【翻译】

    在这片文章中会介绍 Python2 中字典的实现,Hash 冲突的解决方法以及在 C 语言中 Python 字典的具体结构,并分析了数据插入和删除的过程.翻译自python-dictionary-im ...