mongodb简介
mongodb不同于orcle、mysql等关系型数据库,是属于非关系型db,是目前使用最多的nosql。
NoSQL:非关系型的数据库(Not Only SQL)用于超大规模数据的存储。
优点: 高可扩展性、分布式计算、低成本、架构的灵活性,半结构化数据、没有复杂的关系
缺点: 没有标准化、有限的查询功能(到目前为止)、最终一致是不直观的程序
mongodb结构
学习mongodb首先要了解mongodb的组成Schema、model、instance
Schema: 用来定义数据库的结构,相当于一个数据库的模板. Model可以通过mongoose.model 集成其基本属性内容. 当然也可以选择不继承。schema不具备操作数据库的能力。
Model: 由schema编译出的构造器,用来定义集合模型,通过集成Schema定义的基本方法和属性得到相关的内容,Model的实例即是文档。model具备数据库的增删改查。
Instance: 由model构造器创建的实体,通过 new Model()实例得到,即文档document。
Schema
Schema 之所以能够定义documents, 是因为他可以限制你输入的字段及其类型. mongoose支持的基本类型有
String Number Date Buffer
Boolean Mixed ObjectId Array
创建Schema对象时,声明字段类型有两种方法,一种是首字母大写的字段类型,另一种是引号包含的小写字段类型
如果需要在Schema定义后添加其他字段,可以使用add()方法
var MySchema = new Schema;
MySchema.add({ name: 'string', color: 'string', price: 'number' });
Model
Model是由Schema编译而成的假想(fancy)构造器,具有抽象属性和行为。Model的每一个实例(instance)就是一个document,document可以保存到数据库和对数据库进行操作。简单说就是model是由schema生成的模型,可以对数据库的操作。
mongoose.model('mongoose_model', Schema, 'ur_mongodb')
// (参数第一位模型(model)名字,参数二生成model所需要的schema,参数三为集合名
使用model()方法,将Schema编译为Model。model()方法的第一个参数是模型名称
一定要将model()方法的第一个参数和其返回值设置为相同的值,否则会出现不可预知的结果
注:
Mongoose会将集合名称设置为模型名称的小写版。如果名称的最后一个字符是字母,则会变成复数;如果名称的最后一个字符是数字,则不变;如果模型名称为"MyModel",则集合名称为"mymodels";如果模型名称为"Model1",则集合名称为"model1"
var schema = new mongoose.Schema({ num:Number, name: String, size: String});
var MyModel = mongoose.model(‘MyModel’, schema);
Instance
instance 即model构造器创建的实体,通过 new Model()初始化得到,即文档document。
利用mongoose对mongodb增删改查
为了避免混淆只采用connec连接具体连接方式有connection、connect等,有兴趣的可以区了解一下区别
mongoose.connect(uri(s), [options], [options.useMongoClient], [callback])
连接mongodb时回调函数要绑定一个错误事件绑定
var mongoose = require('mongoose');
var config = require('../config').mongodb;
var mongourl = `mongodb://${config.mongo_config.HOST}:${config.mongo_config.PORT}/${config.mongo_config.DATABASE}`;
mongoose.connect(mongourl, config.mongo_option, (err) => {
if (err) {
console.log(err)
process.exit(1)
}
})
mongoose增删改查
不bb 直接上例子
增
Model.create(doc(s),(err,doc(s))=>{}) (单条)
new userModel({id:1,name:'aa',age:23}).save(err,doc(s))=>{}) (单条)
User.collection.insert(quesObj, function(err, doc) {}) (存多条)
删
在model上删文档
Model.remove(conditions,(err,doc)=>{})
在文档上删文档
Model.find({id:{$lte:5}},(err,docs)=>{
docs.remove()
})
改
Model.update(conditions,update,(err,raw)=>{})
查
Model.find(conditions, [fields], [options], [(err,docs)=>{}])
// 参数:查询条件,控制返回的字段(字段筛选),配置查询参数,回调函数
查询:
conditions查询条件参考mongo语法,比如$lte:32之类的
fields即是控制返回数据的字段,就是说你想要哪些key,想要返回name就写’name’,此时默认会返回_id值,写成{name:1,_id:0}即可
options配置查询参数,比如做分页的时候{limit:20}表示返回20条数据(不足返回全部)
callback中err表示查询错误,docs表示返回的结果
.findOne()表示返回数据中的第一条,.findById()表示根据obj.id查找