基础
- 安装不说了
- 启动mongod --dbpath=D:\Mongodb\data(这个目录是数据库存放的目录)
- 数据库 MongoDB的单个实例可以容纳多个独立的数据库,比如一个学生管理系统就可以对应一个数据库实例
- 集合 数据库是由集合组成的,一个集合用来表示一个实体,如学生集合
- 文档 集合是由文档组成的,一个文档表示一条记录,比如一位同学张三就是一个文档
- 分布式的,随便加
- 无需建库建表
- show dbs 查看所有的数据库
- use school解释:就算是没有这个数据库,也可以直接use
- db 查看当前所在数据库
- db.help() 查看帮助
- show collections 查看当前db下的集合
插入 更新
- db.users.insert({id: 1, name: "lrj"})解释:db当前数据库,users集合(就算是没有users也可以直接插入),insert插入一个对象{id: 1, name: "lrj"}
- db.users.save({_id:fdsafd12f12,name: 'xxx'})查看_id对应的值是否相同,不同就更新
- 插入后,mongodb会自己生成一个_id,绝不重复的(因为分布式环境下,要保证_id不重复)
- db.getCollectionNames() 查看当前db下的集合包括system的
- db.createCollection('lessons')创建集合
- db.lessons.find() 查找
- db.users.update({_id:2},{name:'修改后的名字'},{multi:false,upsert:false})查找_id为2的文档,修改name属性,multi是否多条一起操作,upsert是否没找到就插入,这种是整条替换
- db.users.update({name:'lrj'},{$set:{age:10}},{multi:true});这种是只更新或者新增里面的某个属性
- db.users.update({name:'lrj'},{$unset:{age:2}},{multi:true}); 删除一个键值对(age必须是2)
- db.users.update({name:'lrj'},{$inc:{age:5}},{multi:true});取原来的age+5
- db.users.update({},{$set:{hobby:[]}},{multi:true})添加一个数组
- db.student.update({name:'张三'},{$push:{"hobbys":"smoking"}});
- db.student.update({name:'lrj',hobbys:{$ne:"smoking"}},{$push:{"hobbys":"smoking"}});更新hobbys不等于somking的
- db.student.update({name:'lrj'},{$addToSet:{"hobbys":"smoking"}});与上一条等效,set不重复,有就不push了
- var hobbys = ["A",'B'];db.users.update({name:'lrj'},{$addToSet:{hobbys:{$each:hobbys}}});把数组中的元素逐个添加到集合中
- db.usrs.update({name:'lrj'},{$pop:{hobbys:1}});从数组中移除指定的索引中对应的元素(hobby是个数组哈)
- db.usrs.update({name:'lrj'},{$set:{"hobbys.0":"smoking2"}});更新hobby数组第0个元素
复制代码
删除
- db.usrs.remove({name:"lrj"}{justOne: true})删除,这个默认是删所有,修改justOne决定删一条还是多条
- db.dropDatabase()删除当前数据库
- db.users.drop()删除users集合
查询
- db.users.find()返回所有
- db.users.find({},{name:1});空对象表示查询所有,后面表示只要name列,1表示显示,0表示不显示
- db.users.findOne({nane:"lrj"})查询到一条就返回
- db.users.find({age:{$in:[5,7,9,6]}})在5796中的一个
- db.users.find({age:{$nin:[5,7,9,6]}})不在5796中
- db.users.find({age:{$gt:5,$lt:10}})5<x<10----------$lte小于等于,$gte大于等于
- db.users.find({age:{$not:{$nin:[5,7,9,6]}}})5<x<10取反
- let result = db.student.find({friends:[ "A", "B", "C", "D" ]});按所有元素匹配--完全相等
- let result = db.student.find({friends:"A"});匹配一项 包含A的就可以
- let result = db.student.find({friends:{$all:['A',"B"]}});$all 必须同时包含A B
- let result = db.student.find({friends:{$in:['A',"B"]}});$in 或者关系 ,包含A或者B
- let result = db.student.find({friends:{$size:4}});$size 按数组的长度去匹配
- let result = db.student.find({friends:{$size:5}},{friends:{$slice:1}});对friends数组slice
- db.student.find({$where:"this.age>30"},{name:1,age:1});this表示当前每一个row,$where后面跟表达式
- db.students.find({_id:ObjectId("5adb666ecd738e9771638985")});(默认生成的_id值是个对象,我们就抄过来就行了)
- db.users.find().count() 查询结果集的条数
- db.users.skip(5).limit(10)跳过5条,选10条
- db.users.skip(5).limit(10).sort({age: 1})跳过5条,选10条,按age从小到大排,age:-1就是从大到小
- db.students.find({name:/^zhang/})正则查询
- db.students.find({$or:[{age:30},{age:50}]}或查询
- db.students.find({name:'zfpx',$or:[{age:30},{age:50}]})查询 name是zfpx 并且 age是30 或者 age是 50 的数据
复制代码
执行脚本
- mongo test.js mongo可以执行js语法,只不过里面多了一些api
备份恢复
- mongodump --host 127.0.0.1 --port 27017 --out ./backup --collection users --db students
- db.users.drop();
- mongorestore --host 127.0.0.1 --port 27017 ./backup
权限
- 使用use admin进入我们的admin库才能创建用户
- db.system.users.remove({user:'lrj'});删除用户
- db.system.users.find();查询用户
db.createUser({
user:'zfpx',
pwd:'123456',
customData:{
name:'lrj',
email:'fdsf@126.com',
age:9
},
roles:[
{
role:'readWrite',
db:'school'
},
'read'
]
});
复制代码
- 启动的时候加入--auth,连上以后需要验证才能操作(假如是只有可读权限)
- user admin
- db.auth('uname','pwd')
建立索引
- db.users.ensureIndex({name:1});升序。
- 索引就是对插入的数据做一个排序,记录目标数据所在的位置,查询的时候就在有序的索引里找