文档地址: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();
来源:https://www.cnblogs.com/LChenglong/p/12107430.html