文档地址:http://www.mongoosejs.net/docs/guide.html
介绍:Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具
安装mongoose:
$ npm install mongoose
连接数据库
connect()
返回一个状态待定(pending)的连接, 接着我们加上成功提醒和失败警告
例:
let mongoose = require('mongoose'); const db = 'mongodb://127.0.0.1/vue_mall_mobile'; // const db = 'mongodb://127.0.0.1/vue_mall_mobile_v2'; // 服务器临时部署数据库 // 导出一个方法 exports.connect = () => { // 连接数据库 mongoose.connect(db); // 记录数据库连接的次数 let maxConnectTimes = 0; return new Promise((resolve, reject) => { // 连接成功操作 mongoose.connection.once('open', () => { console.log('Mongodb 数据库连接成功.'); resolve(); }); // 连接断开操作 mongoose.connection.on('disconnected', () => { console.log('*********** 数据库断开 ***********'); if (maxConnectTimes < 3) { maxConnectTimes++; mongoose.connect(db); } else { reject(new Error('数据库连接失败')); throw new Error('数据库连接失败'); } }); // 连接失败操作 mongoose.connection.on('error', error => { console.log('*********** 数据库错误 ***********'); if (maxConnectTimes < 3) { maxConnectTimes++; mongoose.connect(db); } else { reject(error); throw new Error('数据库连接失败'); } }); }); }
定义一个user的Schema
/** * 用户信息 */ var mongoose = require('./db.js'), Schema = mongoose.Schema; var UserSchema = new Schema({
username : { type: String }, //用户账号 userpwd: {type: String}, //密码 userage: {type: Number}, //年龄 logindate : { type: Date} //最近登录时间 }); module.exports = mongoose.model('User',UserSchema);
String Number Boolean|Bool Array Buffer Date ObjectId|Oid Mixed
常用数据库操作:
插入:Model#save([fn])
var User = require("./user.js"); /** * 插入 */ function insert() { var user = new User({
username : 'Tracy McGrady', //用户账号 userpwd: 'abcd', //密码 userage: 37, //年龄 logindate : new Date() //最近登录时间
}); user.save(function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }); } insert();
更新:
Model.update(conditions, update, [options], [callback])
Model.findByIdAndUpdate(id, [update], [options], [callback]) 这种比较有指定性,就是根据_id
Model.findOneAndUpdate([conditions], [update], [options][callback]) //找到一条记录并更新
// Model.update(conditions, update, [options], [callback]) var User = require("./user.js"); function update() { var wherestr = { 'username': 'Tracy McGrady' }; var updatestr = { 'userpwd': 'zzzz' }; User.update(wherestr, updatestr, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } update();
// Model.findByIdAndUpdate(id, [update], [options], [callback]) var User = require("./user.js"); function findByIdAndUpdate() { var id = '56f2558b2dd74855a345edb2'; var updatestr = { 'userpwd': 'abcd' }; User.findByIdAndUpdate(id, updatestr, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } findByIdAndUpdate();
删除
Model.remove(conditions, [callback])
Model.findByIdAndRemove(id, [options], [callback])
Model.findOneAndRemove(conditions, [options], [callback])
// Model.remove(conditions, [callback]) var User = require("./user.js"); function del() { var wherestr = { 'username': 'Tracy McGrady' }; User.remove(wherestr, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } del();
条件查询:
Model.find(conditions, [fields], [options], [callback])
// Model.find(conditions, [fields], [options], [callback]) var User = require("./user.js"); function getByConditions() { var wherestr = { 'username': 'Tracy McGrady' }; User.find(wherestr, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } getByConditions();
// Model.find(conditions, [fields], [options], [callback]) // 第2个参数可以设置要查询输出的字段,比如: // 输出只会有username字段,设置方法如上,1表示查询输出该字段,0表示不输出 // 比如我要查询年龄范围条件应该怎么写呢? // User.find({userage: {gte: 21,lte: 65}}, callback); //这表示查询年龄大于等21而且小于等于65岁 // 其实类似的还有: // $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个元素) // 可能还有一些,没什么印象,大家自行看看api _! var User = require("./user.js"); function getByConditions() { var wherestr = { 'username': 'Tracy McGrady' }; var opt = { "username": 1, "_id": 0 }; User.find(wherestr, opt, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } getByConditions();
数量查询
Model.count(conditions, [callback])
// Model.count(conditions, [callback]) var User = require("./user.js"); function getCountByConditions() { var wherestr = {}; User.count(wherestr, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } getCountByConditions();
根据ID查询:
Model.findById(id, [fields], [options], [callback])
// Model.findById(id, [fields], [options], [callback]) var User = require("./user.js"); function getById() { var id = '56f261fb448779caa359cb73'; User.findById(id, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } getById();
模糊查询
// 模糊查询 // 示例中查询出所有用户名中有'm'的名字,且不区分大小写,模糊查询比较常用,正则形式匹配,正则方式就是javascript正则,用到的比较多! var User = require("./user.js"); function getByRegex() { var whereStr = { 'username': { $regex: /m/i } }; User.find(whereStr, function (err, res) { if (err) { console.log("Error:" + err); } else { console.log("Res:" + res); } }) } getByRegex();
分页查询:
// 分页查询 // 分页是用得比较多的查询,分页原理用过其它数据库的都知道,分页用到的函数和mysql的比较类似,sort()是排序规则 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();