mongoose整理笔记
一:参考学习网址
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);
mongoose整理笔记的更多相关文章
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- xmpp整理笔记:发送图片信息和声音信息
图片和音频文件发送的基本思路就是: 先将图片转化成二进制文件,然后将二进制文件进行base64编码,编码后成字符串.在即将发送的message内添加一个子节点,节点的stringValue(节点的值) ...
- xmpp整理笔记:聊天信息的发送与显示
任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示 往期回顾: xmpp整理笔记:环境的快速配置(附安装包) http://www.cnblogs.com/dsxniubilit ...
- xmpp整理笔记:用户网络连接及好友的管理
xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中, ...
- xmpp整理笔记:xmppFramework框架的导入和介绍
一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...
- jQuery整理笔记文件夹
jQuery整理笔记文件夹 jQuery整理笔记一----jQuery開始 jQuery整理笔记二----jQuery选择器整理 jQuery整理笔记三----jQuery过滤函数 jQuery整理笔 ...
- sk_buff整理笔记(两、操作函数)
承接上一:sk_buff 整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针各自是:head.data.tai ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- element-ui Carousel 走马灯源码分析整理笔记(十一)
Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...
随机推荐
- saveLayerAlpha简单入门
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.*; imp ...
- ABAP Memory ID
转自:https://blog.csdn.net/lyq123333321/article/details/52659114 (一) Difference Between SAP a ...
- CentOS安装文件共享samba
参考:https://jingyan.baidu.com/article/03b2f78cdf811c5ea237aebc.html https://www.linuxidc.com/Linux/20 ...
- 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. ...
- laravel的workflow流程插件
原文地址:https://github.com/brexis/laravel-workflow
- react做的简单的购物车
###第一步 :首先电脑上已经安装react的脚手架 cnpm install create-react-app -g ###第二步 :创建项目 creact-react-app 项目 ...
- 基本 Java Bean
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- nginx+keepalived互为主主高可用配置
和nginx主从安装配置都一样 就是配置文件 多加个vip 里面具体要改的 请看下面的配置文件 直接master1上keepalived.conf配置文件内容: ! Configuration ...
- Python 面向对象总结
面向对象 类 class 类型 类变量 实例方法 init attack bite 类指针 - 指向父类 对象 对象指针 实例变量 self.name slef.age 组合 一个对象作为一个属性 s ...
- Python2 中字典实现的分析【翻译】
在这片文章中会介绍 Python2 中字典的实现,Hash 冲突的解决方法以及在 C 语言中 Python 字典的具体结构,并分析了数据插入和删除的过程.翻译自python-dictionary-im ...