概念
(mongoDB)是一个基于分布式文件存储的开源数据库系统
(mongoDB)将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
分布式解决的问题:客户端并发量过大造成的 1.带宽不够 2.数据量太大
mongoDB的缺点:会丢数据 (10000条丢大约3条)
通常只能在bin文件下启动,通过在高级设置配置路径,可以让mongo随处调用。
常用命令
启动数据库
1.bin目录下mongod --dbpath=./mongodata;
2.bin目录下mongo
show dbs; 查看数据库
use 数据库名; 进入某个数据库
db.stu.insert({a:1}); 插入集合字段
db.stu.find();查看集合字段
db.help(); 查看常用命令
db.st.update({id:1},{a:1});更新字段
db.st.update({id:1,{$set:{name:'zf1'}});不删除其他更新字段
db.stu.update({},{$inc:{age:1}});第一条字段age加1,(update默认只更新匹配到的第一条)
db.stu.update({id:1},{name:'zf1'},{upsert:true});插入更新,有更新没有插入
db.stu.update({id:1},{$unset:{name:10}});删除掉文档指定字段
db.stu.update({_id:1,{$push:{hobbies:'smoking'});插入一个
db.stu.update({id:1,hobbies:{$ne:'s'}},{$push:{hobbies:'smoking'}});插入多个
db.stu.update({id:1},{$addToSet:{hobbies:'drinking'}});插入多个
var arr=['one','two'];
db.stu.update({id:1,{$addToSet:{hobbies:{each:arr}}});批量添加
db.stu.update({id:1},{$pop:{hobbies:4}});删除一个
db.stu.update({id:1},{$set:{"hobbies.1":"wyy"}});修改一个
db.stu.remove({a:1});删除所有匹配到的
db.stu.remove({a:1},{justOne:true});删除一条
db.stu.findOne({username:'zf'});只查找一条
db.stu.drop();全部清掉
db.stu.find({age:{$in:[2,4]}});查找age为2和4的
db.stu.find({age:{$gte:3,$lte:5}});3和5之间
db.stu.find({hobbies:{$all:["a","b"]}});查找所有包含["a","b"]
db.stu.find({$where:'this.age>5&&this.age<8'});查找age大于5的
db.stu.count();条数
游标
var b = db.stu.find();
while(b.hasNext()){ printjson(b.next()) };遍历返回
备份和恢复
备份: mongodump --out ./bk --collection stu --db school
恢复: mongorestore ./bk
和node配合使用
let mongoose = require('mongoose');
const conn = mongoose.createConnection('mongodb://localhost:27017/db201808',{ useNewUrlParser: true,useUnifiedTopology: true });
//定义一个schema,规定了一个集合中文档的属性名和属性的类型
//光靠Schema是不能直接操作数据库的
let UserSchema = new mongoose.Schema({
username:{type:String,required:true},
password:String,
createAt:{type:Date,default:Date.now}
});
//定义数据库的操作模型 ,如果调用model方法的时候传了两个参数,表示注册一个模型,一个参数,表示获取一个模型
//集合的名字是来自于模型的名字,模型名->小写->复数
let User = conn.model('User',UserSchema);
// Entity 实体 模型vs实体
let zhuangsan = new User({username:'张三',age:10});
zhuangsan.age = 100;
//把自己的信息保存到数据库中
zhuangsan.save(function(err,result){
console.log(result);
});
// User.create({username:'zhufeng',age:10},function(err,result){
// console.log(err);
// console.log(result);
// })
// ;(async function (){
// //mongoose的任何方法都会返回一个promise
// try{
// let result = await User.create({username:'lisi',age:10});
// console.log(result);
// }catch(err){
// console.log(err);
// }
// })();
conn.on('error',function(err){
console.error(err);
});
conn.on('open',function(){
console.log('连接创建成功');
});
//插入文档
(async function () {
let user =await User.create({username:'lisi',age:10,password:'123456'});
//更新默认是更新匹配到的第一条数据 ,如果要更新多条 multi:true
// let updateResult = await User.update({username:'lisi'},{age:11});
let updateResult1 = await User.updateOne({username:'lisi'},{age:11});
let updateResult2 = await User.updateMany({username:'lisi'},{age:11});
let queryResult1 = await User.find({username:'lisi'},{username:1,age:1});
let queryResult2 = await User.findOne({username:'lisi'});
let queryResult3 = await User.findById('5dccbdba86c94a5b1c25177c');
let queryResult4 = await User.find({age:{$gt:1,$lte:11},username:{$in:['lisi','zhuangsan']}});
console.log(queryResult4);
})();
//排序
User.find().sort({age:1}).skip(3).limit(3).exec(function(err,docs){
console.log(docs);
});
主外键
let mongoose = require('mongoose');
let ObjectId = mongoose.Schema.Types.ObjectId;
const conn = mongoose.createConnection('mongodb://localhost:27017/db201808',{ useNewUrlParser: true,useUnifiedTopology: true });
let UserSchema = new mongoose.Schema({
username:{type:String,required:true},
password:String,
age:Number,
createAt:{type:Date,default:Date.now}
},{collection:'user'});
//集合的名字是来自于模型的名字,模型名->小写->复数
let User = conn.model('User',UserSchema);
let ArticleSchema = new mongoose.Schema({
title:String,
content:String,
user:{type:ObjectId,ref:"User"}
},{collection:'article'});
let Article = conn.model('Article',ArticleSchema);
/**
;(async function(){
let user = await User.create({username:'wangwu'});
let userId = user._id;
let article = await Article.create({title:"标题",content:'内容',user:user._id});
console.log(article);
})();
*/
(async function () {
let article = await Article.findById('5dccf63f2f07b937d8354c91').populate('user');
console.log(article);
// let userId = article.user;
// let author = await User.findById(userId);
// console.log(author.username);
})();
扩展静态和实例方法
//扩展静态方法
// UserSchema.statics.login = function(username,password){
// return this.findOne({username,password});
// }
//扩展实例方法 Entity
UserSchema.methods.login = function(){
return this.model('User').findOne({username:this.username,password:this.password})
}
let User = conn.model('User',UserSchema);
/**
* 如何扩展静态和实例的方法
*/
// (async function login(username,password) {
// await User.create({username:'1',password:'1'})
// })();
// (async function login(username,password) {
// let result = await User.login(username,password);
// console.log(result);
// })('1','1');
(async function login(username,password) {
let user = new User({username,password});
let result = await user.login();
console.log(result);
})('1','1');
虚拟属性
let mongoose = require('mongoose');
let ObjectId = mongoose.Schema.Types.ObjectId;
const conn = mongoose.createConnection('mongodb://localhost:27017/xx',{ useNewUrlParser: true,useUnifiedTopology: true });
let UserSchema = new mongoose.Schema({
username:{type:String,required:true},
password:String,
age:Number,
phone:String,
province:String,
city:String,
createAt:{type:Date,default:Date.now}
},{collection:'user'});
UserSchema.virtual('area').get(function(){
return this.phone.split('-')[0];
});
UserSchema.virtual('number').get(function(){
return this.phone.split('-')[1];
});
UserSchema.virtual('address').get(function(){
return this.province + this.city;
});
//什么是虚拟属性 010-6255888
let User = conn.model('User',UserSchema);
let user = new User({username:'zhangsan',phone:'010-6255888',province:'浙江',city:'杭州'});
let area = user.area;
let number = user.number;
let address = user.address;
console.log(area,number,address);
钩子函数
let mongoose = require('mongoose');
let ObjectId = mongoose.Schema.Types.ObjectId;
let crypto = require('crypto');
const conn = mongoose.createConnection('mongodb://localhost:27017/xx',{ useNewUrlParser: true,useUnifiedTopology: true });
let UserSchema = new mongoose.Schema({
username:{type:String,required:true},
password:String,
age:Number,
phone:String,
province:String,
city:String,
createAt:{type:Date,default:Date.now}
},{collection:'user'});
UserSchema.pre('save',function(next){
this.password = crypto.createHmac('sha1','zf').update(this.password).digest('hex');
next();
});
let User = conn.model('User',UserSchema);
;(async function register(username,password) {
// password = crypto.createHmac('sha1','zf').update(password).digest('hex');
let user = new User({username,password});
await user.save();
})('11','11');
// (async function login(username,password) {
// password = crypto.createHash('md5').update(password).digest('hex');
// let oldUser = await User.findOne({username,password});
// console.log(oldUser);
// })('user','pwd');