Mongoose基础篇 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB 下载 你可以在mongodb官网下载该安装包,地址为 http://www.mongodb.org/downloads
Schema
一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
Model
由Schema
发布生成的模型,具有抽象属性和行为的数据库操作对
Entity
由Model
创建的实体,他的操作也会影响数据库
Schema
、Model
、Entity
的关系 :
Schema生成
Mode,
Model创造
Entity,
Model和
Entity都可对数据库操作造成影响,但
Model比
Entity`更具操作性。
MongoDB 使用 1.首先你必须安装MongoDB和NodeJS
2.在项目只能够创建一个数据库连接,如下:
COPY var mongoose = require('mongoose'); //引用mongoose模块
var db = mongoose.createConnection('localhost','test'); // 创建一个数据库连接
3.打开本机localhost的test数据库时,我们可以监测
4.在工作文档中定义一个Schema
COPY var userSchema=new mongoose.Schema({
username:String,
password:String,
email:String,
});
schemas中的数据类型有以下几种:
String
Number
Date
Boolean
Buffer
ObjectId
Mixed
Array
特别需要说明一下ObjectId类型和Mixed类型以及Array类型,在schemas中声明这几
种类型的方式如下:
ObjectId就类似于唯一键值
projectSchema.add({
owner: mongoose.Schema.Types.ObjectId })
//混合类型,顾名思义,就是说里面可以放置任意类型的数据,有两种方式创建该类型数据
//方式一:直接赋予一个空的字面量对象 vardjSchema= new mongoose.Schema({ mixedUp: {} });
//方式二:根据Schemas.Types中值来赋予 vardjSchema= new mongoose.Schema({ mixedUp: Schema.Types.Mixed });
//Array类型数据有两种创建方式,一种是简单数组创建: var userSchema = new mongoose.Schema({ name: String, emailAddresses: [String] });
//第二种方式就是复杂类型数据数组,例如我们可以再数组中添加不同类型的schemas:
COPY var emailSchema = new mongoose.Schema({
email: String,
verified: Boolean
});
var userSchema = new mongoose.Schema({
name: String,
emailAddresses: [emailSchema]
});
//注意:如果定义一个空的数据的话,则会创建为一个混合类型数据的数组:
var emailSchema = new mongoose.Schema({
email: String,
verified: Boolean
});
var userSchema = new mongoose.Schema({
name: String,
emailAddresses: [emailSchema]
});
5 将Schema发布为Model,并且输出
COPY module.exports={
users:mongoose.model('users',userSchema,'users')
}
// model后的参数 第一个users是模型model的名字,可以随便取名
// 参数二是产出model的Schema名,和上面的要对应,
// 参数3是数据库下的集合名称,可以随意取
6.我们甚至可以为此Schema创建方法
COPY //为Schema模型追加speak方法
PersonSchema.methos.speak = function(){
console.log('我的名字叫'+this.name);
}
var PersonModel = db.model('Person',PersonSchema);
var personEntity = new PersonModel({name:'Krouky'});
personEntity.speak();//我的名字叫Krouky
7 如果要执行查询,需要依赖Model,当然Entity也是可以做到的
COPY PersonModel.find(function(err,persons){
//查询到的所有person
});
查找数据和读取数据的方法 查询的方式 通常有2种查询方式,一种是直接查询
,一种是链式查询
(2种查询都是自己命名的)直接查询
在查询时带有回调函数的,称之为直接查询,查询的条件往往通过API来设定,例如:
COPY PersonModel.findOne({'name.last':'dragon'},'some select',function(err,person){
//如果err==null,则person就能取到数据
});
链式查询
在查询时候,不带回调,而查询条件通过API函数来制定,例如:
COPY var query = PersonModel.findOne({'name.last':'dragon'});
query.select('some select');
query.exec(function(err,pserson){
//如果err==null,则person就能取到数据
});
这种方式相对直接查询,分的比较明细,如果不带callback,则返回query,query 没有执行的预编译查询语句,该query对象执行的方法都将返回自己,只有在执行 exec方法时才执行查询,而且必须有回调。
更新数据 有三种方式来更新数据:
(1)update(conditions,update,options,callback);
该方法会匹配到所查找的内容进行更新,不会返回数据;
(2)findOneAndUpdate(conditions,update,options,callback);
该方法会根据查找去更新数据库,另外也会返回查找到的并未改变的数据;
(3)findByIdAndUpdate(conditions,update,options,callback);
该方法跟上面的findOneAndUpdate方法功能一样,不过他是根据ID来查找文档并更新的。
三个方法都包含四个参数,一下稍微说明一下几个参数的意思:
conditions:查询条件
update:更新的数据对象,是一个包含键值对的对象
options:是一个声明操作类型的选项,这个参数在下面再详细介绍
callback:回调函数
对于options参数,在update方法中和findOneAndUpdate、findByIdAndUpdate
两个方法中的可选设置是不同的;
//在update方法中,options的可选设置为:
{
safe:true|false, //声明是否返回错误信息,默认true
upsert:false|true, //声明如果查询不到需要更新的数据项,是否需要新插入一
条记录,默认false
multi:false|true, //声明是否可以同时更新多条记录,默认false
strict:true|false //声明更新的数据中是否可以包含在schema定义之外的字段
数据,默认true
}
//对于findOneAndUpdate、findByIdAndUpdate这两个方法,他们的options可
选设置项为:
{
new:true|false, //声明返回的数据时更新后的该是更新前的,如果为true则返回
更新后的,默认true
upsert:false|trure,
sort:javascriptObject, //如果查询返回多个文档记录,则可以进行排序,在这
里是根据传入的javascript object对象进行排序
select:String //这里声明要返回的字段,值是一个字符串
}
数据删除 跟更新数据一样,也有三种方法给我们删除数据:
remove();
findOneAndRemove();
findByIdAndRemove();
数据验证 mongoose内置数据验证
在mongoose中,数据验证这一层是放在schema中的,mongoose已经帮我们做了很多内
置的数据验证,有一些验证是针对某些数据类型的,也有一些是针对所有数据类型的。
能够作用在所有数据类型上的验证有require,意思就是该字段是否是必须的,例如:
email: { type: String, unique: true, required: true }
上面的代码就定义了一个email是必须的schema.