软件配置:
1.node v8.9.3
2. npm 5.5.1
3. mongoose及MongoDB版本见下package.json
// package.json
{
"name": "mongoosedemo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"mongodb": "^3.1.1",
"mongoose": "^5.2.4"
}
}
Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
Model : 由 Schema 发布生成的模型,具有抽象属性和行为的数据库操作
Entity : 由 Model 创建的实体,他的操作也会影响数据库
三者关系:
Schema 生成 Model,Model创造 Entity;
Model 和 Entity 都可对数据库操作造成影响,但 Model 比Entity 更具操作性。
// db.js
const mongoose = require('mongoose');
const DB_URL = 'mongodb://localhost:27017/mydatabase1';
// 连接
mongoose.connect(DB_URL, { useNewUrlParser: true });
// 连接成功
mongoose.connection.on('connected', function () {
console.log('Mongoose connection open to ' + DB_URL);
})
// 连接异常
mongoose.connection.on('error', function (err) {
console.log('Mongoose connection error ' + err);
})
// 连接断开
mongoose.connection.on('disconnected', function () {
console.log('Mongoose connection disconnected ');
})
// 修改上面db.js 新增最后一行,导出mongoose对象
const mongoose = require('mongoose');
const DB_URL = 'mongodb://localhost:27017/mydatabase1';
// 连接
mongoose.connect(DB_URL, { useNewUrlParser: true });
// 连接成功
mongoose.connection.on('connected', function () {
console.log('Mongoose connection open to ' + DB_URL);
})
// 连接异常
mongoose.connection.on('error', function (err) {
console.log('Mongoose connection error ' + err);
})
// 连接断开
mongoose.connection.on('disconnected', function () {
console.log('Mongoose connection disconnected ');
})
module.exports = mongoose;
// 定义一个user的Schema,命名为user.js
/**
* 用户信息
*/
// 定义数据库表存储结构
const mongoose = require('./db');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
username: { type: String }, // 用户名
password: { type: String }, // 用户密码
age: { type: String }, // 用户年龄
lastLoinDate: { type: Date } // 最近登录一次时间
})
定义好了Schema,接下就是生成Model。
model是由schema生成的模型,可以对数据库的操作
// 修改上面的user.js,将Schema转成Model,并导出
// user.js
/**
* 用户信息
*/
// 定义数据库表存储结构
const mongoose = require('./db');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
username: { type: String }, // 用户名
password: { type: String }, // 用户密码
age: { type: String }, // 用户年龄
lastLoinDate: { type: Date } // 最近登录一次时间
})
// 生成Model
module.exports = mongoose.model('User', UserSchema);
Model#save([fn])
新建test.js
const User = require('./user');
// 插入
function insert() {
var user = new User({
username: "陈二狗", // 用户名
password: "abc123", // 用户密码
age: 18, // 用户年龄
lastLoinDate: new Date() // 最近登录一次时间
});
user.save(function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
insert();
node test.js
Model.update(conditions, update, [options], [callback])
// test1.js
const User = require('./user');
// 更新
function update() {
var whereStr = {"username": "陈二狗"};
var updateStr = {"password": "123456"};
User.update(whereStr, updateStr, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
update();
node test1.js
常用方法还有 findByIdAndUpdate,这种比较有指定性,就是根据_id
Model.findByIdAndUpdate(id, [update], [options], [callback])
// test12.js
const User = require('./user');
// 根据ID更新
function findByIdAndUpdate() {
var id = "5b5333a114cf2d337c6bd971";
var updateStr = {"password": "aabbcc"};
User.findByIdAndUpdate(id, updateStr, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
findByIdAndUpdate();
其它更新方法
Model.findOneAndUpdate([conditions], [update], [options],[callback]) //找到一条记录并更新
Model.remove(conditions, [callback])
// test2.js
const User = require('./user');
// 删除
function del() {
var whereStr = {"username": "陈二狗"};
User.remove(whereStr, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
del();
其它常用方法还有:
Model.findByIdAndRemove(id, [options], [callback])
Model.findOneAndRemove(conditions, [options], [callback])
已先插入一些测试数据 。。
Model.find(conditions, [fields], [options], [callback])
const User = require('./user');
// 条件查询
function getByConditions() {
var whereStr = {"username": "陈二狗1"};
User.find(whereStr, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getByConditions();
第2个参数可以设置要查询输出的字段,比如改成
const User = require('./user');
// 条件查询(设置第二个参数)
function getByConditions() {
var whereStr = {"username": "陈二狗1"};
var opt = {"username": 1, "_id": 0};
User.find(whereStr, opt, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getByConditions();
输出只会有username字段,设置方法如上,1表示查询输出该字段,0表示不输出
const User = require('./user');
// 条件查询
function getByConditions() {
// var whereStr = {"username": "陈二狗1"};
// var opt = {"username": 1, "_id": 0};
// User.find(whereStr, opt, function (err, docs) {
// 查询年龄大于等20而且小于等于50岁
User.find({"age": {$gte: 20, $lte: 50 }}, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getByConditions();
$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])
const User = require('./user');
// 数量查询
function getCountByConditions() {
var whereStr = {};
// User.count(whereStr, function (err, docs) {
User.countDocuments(whereStr, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getCountByConditions();
修改后:
Model.findById(id, [fields], [options], [callback])
const User = require('./user');
// 根据_id查询
function getById () {
var id = "5b536b314cfb3f0d54a53d37"
User.findById(id, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getById ();
新增部分数据
const User = require('./user');
// 模糊查询
// 查询出所有用户名中有'm'的名字,且不区分大小写
function getByRegex () {
var whereStr = {"username": {$regex: /m/i}};
User.find(whereStr, function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getByRegex ();
const User = require('./user');
// 分页查询
function getByPager () {
var pageSize = 5; // 一页多少条
var currentPage = 1; // 当前第几页
var sort = {'lastLoinDate': -1}; // 按登录时间倒序排
var condition = {};
var skipnum = (currentPage - 1) * pageSize; // 跳过数
User.find(condition).skip(skipnum).limit(pageSize).sort(sort).exec(function (err, docs) {
if(err) {
console.log("Error: " + err);
} else {
console.log("docs: " + docs);
}
})
}
getByPager ();
currentPage = 1
的时候
currentPage = 2
的时候
Model.distinct(field, [conditions], [callback]) //去重
Model.findOne(conditions, [fields], [options], [callback]) //查找一条记录
Model.findOneAndRemove(conditions, [options], [callback]) //查找一条记录并删除
Model.findOneAndUpdate([conditions], [update], [options], [callback]) //查找一条记录并更新
相关代码下载
注:
mongodb学习(3)— NodeJs使用mongoose操作mongodb
mongoosejs
mongoose学习笔记2015-7-24
Mongoose学习参考文档——基础篇
Mongoose学习参考文档——基础篇
超详细的数据库mongoose的使用方法/教程
极客学院