Mongoose使用
文章来自
Mongoose基础入门
Mongoose的API
Mongoose模式扩展
指南之查询
指南之验证
mongoose方法很多,很乱,版本不一样,有些方法可能都过时了,所以整理了很久
连接数据库
先下插件,目录创建一个mongoose文件夹,mongoose文件夹里有一个入口的 index.js 和一个 model 文件夹
// mongoose/index.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/app',{useNewUrlParser:true,useUnifiedTopology: true},function(err){
if(err){
console.log('Connection Error:' + err)
}else{
console.log('mongoose Connection success!')
}
});
module.exports = mongoose;
// app.js
// 启动的时候连接一下mongodb,不需要使用 koa.use
const mongoose = require('./src/mongoose')
整个操作流程分为
- 创建Schema和校验器
- 由Schema创建model
- 操作【分为存和查】,那删和改呢,其实删和改都是需要先查的
创建Schema,由Schema创建model
// mongoose/model/blog.js
var mongoose = require('mongoose');
var blogSchema = new mongoose.Schema({
title: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
})
// 这种写法是创建一个test的model,并且接下来的操作是执行到tests表里
var blogModel = mongoose.model('test', blogSchema);
// 这种写法是创建一个test的model,并且接下来的操作是执行到test表里
var blogModel = mongoose.model('test', blogSchema,'test');
module.exports = blogModel;
操作之存
- save
- insertMany
var blogModel = require("mongoose/model/blog").blogModel;
# 插入一条数据用Entity + save
var blogEntity = new blogModel({
title: "Mongoose",
author: "L",
body: "Documents are instances of out model. Creating them and saving to the database is easy",
comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
hidden: false,
meta: {
votes: 100,
favs: 99
}
});
blogEntity.save(function(err, docs){
if(err) console.log(err);
console.log('保存成功:' + docs);
});
# 多条数据插入,将多条数据一次性插入,相对于循环使用create保存会更加快,但是没有数据校验
blogModel.insertMany([
{title: "mongoose1", author: "L"},
{title: "mongoose2", author: "L"}
], function(err, docs){
if(err) console.log(err);
console.log('保存成功:' + docs);
});
操作之查
下面的方法都属于query的链式查询方法
// 找的方法
Query.prototype.find() // 找,传字符串是找这个字段后面接判断方法,传键值对是找到key等于这个value的值,传数组是并且条件表示and
Query.prototype.where() // 同上
Query.prototype.count() // 数量
Query.prototype.distinct() //去重
Query.prototype.exists() // 存在
Query.prototype.gt() //大于
Query.prototype.gte() //大于等于
Query.prototype.all() // 全存在
Query.prototype.in() // 存在一个
Query.prototype.nin() // 不在这里
Query.prototype.limit() // 分页
Query.prototype.lt() // 小于
Query.prototype.lte() // 小于等于
Query.prototype.ne() // 不等于
Query.prototype.or() // 二选一
Query.prototype.regex() // 正则,模糊查询
Query.prototype.select() // 选择部分字段
Query.prototype.size() //
Query.prototype.skip() // 跳过
Query.prototype.slice() // 切断
Query.prototype.sort() // 排序
// 操作的方法
Query.prototype.updateOne()
Query.prototype.updateMany()
Query.prototype.removeOne()
Query.prototype.removeMany()
// 上面写完后是不会执行的,执行有两种写法
// 回调,callback里callback
query.exec(callback)
// promise链式调用,callback里返回另一个query,就可以继续then
query.then(callback)
// promise改进版,async+await
async function init() {
var A = await model.updateMany({'name':"name2"})
console.log(A)
}
自定义query方法
userSchema.query.byName = function (name){
return this.find({name});
}
var model= mongoose.model('model', userSchema);
model.find().byName('pdt1997').exec(callback)
效验器
// required,Number(max,min),String(enum,match)
var OrderSchema = new mongoose.Schema({
count: {
type: Number,
// 是否必须的校验器
required: true,
// 数字类型的最大值校验器
max: 1000,
// 数字类型的最小值校验器
min: 10
},
status: {
type: String,
// 设置字符串的可选值
enum: ['created', 'sucess', 'failed']
},
desc: {
type: String,
// 使用正则表达式来校验字符串的内容
match: /book/g,
// 自定义的验证器,如果通过验证返回 true,没有通过则返回 false
validate: function(desc) {
return desc.length >= 10;
}
}
});
模式修饰符
var User = mongoose.model('User', {
nickname: {
type: String,
// 预定义的修饰符
// 效果:消除字符串前后的空格
trim: true
},
blog: {
type: String,
// 自定义的 setter 修饰符
set: function(url){
if(!url) return url;
if(0 !== url.indexOf('http://') && 0 !== url.indexOf('https://'))
url = 'http://' + url;
return url;
},
get: function(url){
if(!url) return url;
if(0 !== url.indexOf('http://') && 0 !== url.indexOf("https://"))
url = 'http://' + url;
return url;
}
}
});
索引
var BookSchema = new mongoose.Schema({
isbn: {
type: Number,
// 唯一索引,可以用来检查是否唯一
unique: true
},
name: {
type: String,
// 辅助索引,完全是为了增加查询速度
index: true
}
});
自定义静态方法
在Schema添加,在model调用
// 做一个分页
userSchema.statics.paginate = function (conditons={},skip = 0,limit = 1){
return this.find(conditons).skip(skip).limit(limit);
}
var model= mongoose.model('model', userSchema);
model.paginate({},getSkip(1),limit).then((docs)=>{
console.log("第1页",docs);
});
自定义实例方法
在Schema添加,在Entity调用
BookSchema.methods.print = function(){
console.log('Book Information:');
console.log('\tTitle:', this.name);
console.log('\tISBN:', this.isbn);
};
var book = new Book({
name: 'MEAN Web Development',
isbn: 9787100
});
book.print()
前后钩子
又叫中间件
// 文档中间件(init/validate/save/remove)
// 查询中间件(count/find/findOne/findOneAndRemove/findOneAndUpdate/update)
// 做某些特定查询操作的时候会调用的中间件
// pre
var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
schema.pre('find',function(next){
console.log('我是pre方法1');
next();
});
schema.pre('find',function(next){
console.log('我是pre方法2');
next();
});
var temp = mongoose.model('temp', schema);
temp.find(function(err,docs){
console.log(docs[0]);
})
// 我是pre方法1
// 我是pre方法2
// { _id: 5972ed35e6f98ec60e3dc886,name: 'huochai',age: 27,x: 1,y: 2 }
// post
var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
schema.post('find',function(docs){
console.log('我是post方法1');
});
schema.post('find',function(docs){
console.log('我是post方法2');
});
var temp = mongoose.model('temp', schema);
temp.find(function(err,docs){
console.log(docs[0]);
})
// { _id: 5972ed35e6f98ec60e3dc886,name: 'huochai',age: 27,x: 1,y: 2 }
// 我是post方法1
// 我是post方法2
Mongoose使用的更多相关文章
- mongoose - 让node.js高效操作mongodb
Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...
- 在mongoose中使用$match对id失效的解决方法
Topic.aggregate( //{$match:{_id:"5576b59e192868d01f75486c"}}, //not work //{$match:{title: ...
- Mongo基础使用,以及在Express项目中使用Mongoose
MongoDB的基本使用 MongoDB特点: 使用BSON存储数据 支持相对丰富的查询操作(相对其他nosql数据库) 支持索引 副本集(支持多个实例/多个服务器运行同个数据库) 分片(数据库水平扩 ...
- mongoose数据库连接和操作
var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...
- mongoose 和 mongoDB
第三方学习地址:http://blog.csdn.net/foruok/article/details/47746057 下载mongoDB https://www.mongodb.com/downl ...
- Nodejs之MEAN栈开发(三)---- 使用Mongoose创建模型及API
继续开扒我们的MEAN栈开发之路,前面两节我们学习了Express.Jade引擎并创建了几个静态页面,最后通过Heroku部署了应用. Nodejs之MEAN栈开发(一)---- 路由与控制器 Nod ...
- Mongoose Schemas定义中timestamps选项的妙用
在Node.js中使用MongoDB少不了Mongoose. 假设有如下Mongoose Schemas的定义: var ItemSchema = new mongoose.Schema({ biz: ...
- Mongodb 数据类型及Mongoose常用CURD
前言 看完了Node.js实战,其中在数据存储部分提到了Redis.Mongodb,我自己也根据书中的介绍写了几个简单的demo,在demo的过程首先遇到的问题就是数据类型和常见的CURD写法. mo ...
- Mongoose使用案例--让JSON数据直接入库MongoDB
目录 1.准备工作. 2.配置Mongoose. 3.创建目录及文件. 4.插入数据,POST提交JSON增加一条记录. 5.查询数据,取出你插入数据库的记录. 一.准备工作 使用Express4创建 ...
- 利用Mongoose来结构化模式与验证
Mongoose是一个文档对象模型(ODM)库,为MongoDB Node.js原生驱动程序提供更多的功能. 把结构化的模式应用到一个MongoDB集合,提供了验证和类型转换的好处 Mongoose通 ...
随机推荐
- Python 爬取 热词并进行分类数据分析-[热词分类+目录生成]
日期:2020.02.04 博客期:143 星期二 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[ ...
- swiper选项卡还可以左右滑动,最后一个直接跳转链接
整理分享: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...
- hadoop启动报错处理
1. hadoop启动报错 1.1. 问题1 util.NativeCodeLoader: Unable to load native-hadoop library for your ...
- python笔记心得
1.字典的映射 day=10# def get_sunday():# return 'Sunday'# def get_monday():# return 'monday'# def get_tues ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:可滚动
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- ES5中的this
参考资料:>>> this的指向 在 ES5 中,其实 this 的指向,始终坚持一个原理: this 永远指向最后调用它的那个对象 下面我们来看一个最简单的例子:(例子均来自参考资 ...
- python爬虫(二) urlparse和urlsplit函数
urlparse和urlsplit函数: urlparse: url='http://www.baidu.com/s?wd=python&username=abc#1' result=pars ...
- 二次代价函数、交叉熵(cross-entropy)、对数似然代价函数(log-likelihood cost)(04-1)
二次代价函数 $C = \frac{1} {2n} \sum_{x_1,...x_n} \|y(x)-a^L(x) \|^2$ 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本 ...
- LeetCode 725. Split Linked List in Parts(分隔链表)
题意:将原链表分隔成k个链表,要求所有分隔的链表长度差异至多为1,且前面的链表长度必须大于等于后面的链表长度. 分析: (1)首先计算链表总长len (2)根据len得到分隔的链表长度要么为size, ...
- 浅谈区块链和p2p网络
最近对区块链产生了兴趣就去了解了一下,分享一下.... 首先要先了解一下什么叫做区块链: 区块链:简单来说就是一种基于分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式. 相信说 ...