mongoDB

407 阅读3分钟

概念

(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');