1、简介
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具
要使用它必须安装好mongodb,关于mongodb的安装和使用请参考MongoDB的安装和简单使用
Github地址:https://github.com/Automattic/mongoose
API文档:http://mongoosejs.com/docs/guide.html
2、安装和使用
2.1、安装:在项目目录中使用npm
进行安装
npm install mongoose
新建一个db.js
文件
ar mongoose = require('mongoose')
var DB_URL = 'mongodb://localhost:27017/mongooseSample'
//连接数据库
mongoose.connect(DB_URL)
//连接成功回调
mongoose.connection.on('connected',function () {
console.log('connect mongodb success')
})
// 连接错误回调
mongoose.connection.on('error',function(err){
console.log(err)
})
// 断开连接回调
mongoose.connection.on('disconnected',function(){
console.log('mongodb disconnected');
})
运行db.js如果打印connect mongodb success
则证明连接成功。
2.2、schema: 是mongoose里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力。创建UserSchema
var Schema = mongoose.Schema;
var UserSchema = new Schema(
username: String, // 用户账号
password:String, //密码
age:String, // 年龄
loginDate:Date //登录的时间
})
属性支持的类型有:String
、Number
、Boolean | Bool
、Array
、Buffer
、Date
、ObjectId | Oid
、Mixed
2.3、生成model:model是由schema生成的模型,可以对数据库的操作。生成User
Model
var User = mongoose.model('User',UserSchema)
2.4、创建一个user实例插入一条数据
function insert(){
var user = new User({
username:'xiaoming',
password:'123',
age:'27',
loginDate: new Date()
})
user.save(function(err,res){
if (err) {
console.log('Error:' + err)
}else {
console.log('Res:' + res);
}
})
}
insert();
在终端查看结果,新建了users集合,成功插入了一条数据
> show tables
users
> db.users.find()
{ "_id" : ObjectId("5913bbbd50e29f099ed1618d"), "username" : "xiaoming", "password" : "123", "age" : "27", "loginDate" : ISODate("2017-05-11T01:17:49.411Z"), "__v" : 0 }
2.5、更新update
新建一个update.js
var User = require('./User.js')
//更新
function update() {
var conditon = {'username':'xiaoming'} // 更新条件
var updateStr = {'password':'isveryhard'} // 需要跟新的字段
User.update(conditon,updateStr,function(err,res){
if (err) {
console.log(err)
}else {
console.log(res)
}
})
}
update();
执行,并在终端查看修改成功了。
其他更新方法
Model.findByIdAndUpdate(id, [update], [options], [callback])
根据_id查询进行更新
Model.findOneAndUpdate([conditions], [update], [options], [callback])
查找到一条并更新
2.6删除方法
Model.remove(conditions, [callback])
实例如下:
var User = require('./User.js')
var condition = {'username':'xiaoming'} // 条件
User.remove(condition,function (err,res) {
if (err) {
console.log('error' + err)
}else {
console.log('result' + res)
}
})```
终端显示删除成功。
其他删除方法如下
`Model.findByIdAndRemove(id, [options], [callback]) `
`Model.findOneAndRemove(conditions, [options], [callback])`
2.7查询方法
`Model.find(conditions, [fields], [options], [callback])`
实例如下
var User = require('./User.js')
var conditon = {'username':'xiaoqiang'}
User.find(conditon,function (err,res) {
if (err) {
console.log('error' + err)
}else {
console.log('res' + res)
}
})```
其中第二参数可以设置查询输出的字段,改写下上面的代码
var User = require('./User.js')
var conditon = {'username':'xiaoqiang'}
var fields = {'username':1,'_id':0} // 其中表示该字段输出,0表示不输出
User.find(conditon,fields,function (err,res) {
if (err) {
console.log('error' + err)
}else {
console.log('res' + res)
}
})```
查询结果只输出:`{ username: 'xiaoqiang' }`
如果需要查询年龄20-30岁的条件语句怎么写呢?
var condition= {age:{$gte:20,$lte:30}}
其中$gte:表示大于等于,lte:表示小于等于,下面是其他类似得查询
$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个元素)```
数量查询的方法:Model.count(conditions, [callback])
更加id查询方法:Model.findById(id, [fields], [options], [callback])
分页查询的方法实例
var User = require("./user.js");
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);
}
})
}
getByPager();```
其他方法:
如去重:`Model.distinct(field, [conditions], [callback]) `