一、数据库操作
1、查看所有的数据库
show dbs;
show databases;
2、切换数据库
use 数据库名;
Tip
:在MongoDB中我们可以成功切换至一个尚不存在的数据库,这是因为在MongoDB中数据库(database)和集合(collection)都不需要我们手动创建,Mongo会在我们第一次向某个数据库的某个集合中插入文档的时候为我们同时创建对应的数据库和文档
3、查看当前所处的数据库:可能这个数据库尚未创建
db; #db其实是一个变量,指向的就是当前所在的数据库
4、删除数据库:在数据库中没有集合的时候Mongo会自动删除数据库
db.dropDatabase();
二、集合操作
1、查看当前数据库中的所有集合
show collections;
2、删除当前数据库的指定集合
db.<collection>.drop();
三、文档对象操作
Ⅰ:插入操作
1、向当前数据库的指定集合中插入一个或多个文档
#collection是指定的集合,可能存在,也可能尚未创建
db.<collection>.insert(doc);#doc是JSON格式的文档数据
#示例:向当前数据库的stu集合中插入一个文档对象
db.stu.insert({name:"tommy",age:12,gender:"male"});
#示例:向当前集合中插入多个文档对象,参数是一个[]
db.stu.insert([
{name:"jerry",age:2,email:"jerry@sina.com"},
{name:"doggy",age:4,email:"jerry@sina.com"}
]);
Tip
:当我们想集合中插入文档时,如果没有给定_id属性,则Mongo会给插入的文档生成一个_id作为文档对象的唯一标识,如果我们给定了_id,则会使用我们给定的(建议使用Mongo生成的的),这个唯一标识是不能重复的,我们也可以调用Mongo提供的生成_id的方法:
ObjectId();
2、其他的两个插入文档对象的方法:在3.2版本中新加的
db.<collection>.insertOne(doc);#插入一个文档对象
db.<collection>.insertMany(doc);#同时插入多个文档对象,参数是[],即使只插入一个也需要放在[]中
例题:向numbers集合中插入20000条数据
实现方式①:在for循环中执行20000次insert操作,类似于Mysql,每执行一次insert()操作都需要获取连接,效率很低
for(var i = 1;i <= 20000; i++){
db.numbers.insert({num:i});
}
实现方式②:只调用一次insert(),效率大大提高
var arr = [];
for(var i = 1;i <= 20000; i++){
arr.push({num:i});
}
db.numbers.insert(arr);
Ⅱ:删除操作
1、删除符合条件的对象:必须传入参数,想匹配所有时传入空对象{}
db.collection.deleteOne({});#删除符合条件的第一个对象
db.collection.deleteMany({});#删除符合条件的所有对象
db.collection.remove({});#删除符合条件的所有文档,注意必须传入参数,若第二个参数传true则只删除第一个
db.collection.remove({},true);#只删除符合条件的第一个
#示例:清空集合中的对象,但不会删除集合本身
db.stus.remove({});#传入空对象
Tip
:
1️⃣清空集合时采用db.stus.remove({});的方式效率很低,因为要先将所有的对象查询出来,再一个个的删除,如果想清空集合的话可以使用db.stus.drop();的方式,这种方式效率更高
2️⃣集合中没有文档的时候集合不会被删除,除非drop(),但数据库中没有集合的时候Mongo会删除数据库
Ⅲ:修改操作
1、修改集合中符合条件的对象为新对象:注意这个不是只改变对象的属性值,而是改变整个对象,_id的值不会改变
db.<collection>.update(条件对象,新对象);
2、修改符合条件的第一个对象的指定属性:使用$set操作符,此时则不会改变整个对象,而是改变这个对象的值,如果此时该对象没有这个指定的属性,则会为这个对象创建该属性
#改变一个属性的值
db.stu.update({age:18},{$set:{name:"tommy"}});
#改变多个属性的值
db.stu.update({age:18},{$set:{name:"tommy",address:"america"}});
3、删除符合条件的第一个对象的指定属性:使用$unset操作符,此时属性的值可以任意,但必须有,因为参数必须是一个完整的对象,这一点不太好,或许应该优化为传入一个[],[]中放入属性名的列表会更直观
#删除一个属性
db.stu.update({age:18},{$unset:{name:1}});
#删除多个属性
db.stu.update({age:18},{$unset:{name:1,address:1}});
Tip
:update()默认情况下只会修改符合条件的第一个对象
,功能和updateOne()一样
db.stus.updateOne({"name":"jerry"},{$set:{address:"高老庄"}});
我们也可以通过给update()传递第三个参数的方式来修改符合条件的多个对象:
db.stus.update({"name":"jerry"},{$set:{address:"花果山"}},{multi:true});
4、修改或删除所有符合条件的对象的指定属性:
db.stus.updateMany({"name":"jerry"},{$set:{address:"高老庄"}});
db.stus.updateMany({"name":"jerry"},{$unset:{address:"高老庄"}});
5、替换符合条件的对象:只替换符合条件的第一个对象,也不会改变_id属性的值
db.stu.replaceOne({age:2},{school:"二中"});
6、向符合条件的第一个文档对象的指定属性中添加一个值:使用$push或$addToSet,区别在于$addToSet在[]中已经有的时候则不会添加,此时该属性的值必须是一个[],否则会报错
#向[]中添加一个值
db.users.update({username:"ts"},{$push:{"hobby.movies":"hero"}});
#向[]中添加一个值,但该值存在时则不添加
db.users.update({username:"ts"},{$addToSet:{"hobby.movies":"hero"}});
7、为所有薪资低于1000的员工增加400元工资:$inc,在原来的基础上自增
db.emps.updateMany({sal:{$lt:1000}},{$inc:{sal:400}});
Ⅳ:查询操作
1、查看当前数据库的指定集合中的所有文档
db.<collection>.find();
#示例:查看当前数据库的stu集合中的所有文档
db.stu.find();
2、查询指定集合中符合条件的文档对象:find()方法中传入查询条件,查询条件也是一个Json对象
db.<collection>.find({});#传空对象时查询所有
db.<collection>.find({属性1:值1,属性2:值2});#查询属性1包含值1且属性2包含值2,此处说包含是因为属性的值可能是[]
#示例
db.stus.find({age:16});
db.stus.find({age:16,name:"jerry"});
Tip
:通过find()查询出的结果其实是一个[],我们可以通过数组索引的方式获取具体的某一个对象,索引从0开始
db.stus.find({age:28})[1];#获取符合条件的第一个对象,索引从0开始
3、查询符合条件的第一个对象
db.<collection>.findOne();#也可以传入查询条件
#等同于
db.<collection>.find()[0];
4、查询文档对象的属性值
db.<collection>.find()[0].name;
db.<collection>.findOne().name;
5、查询集合中符合条件的文档总数:find()中传条件对象
db.<collection>.find({}).count();
#或
db.<collection>.find({}).length();
6、内嵌文档的条件查询:查询条件对象的属性必须使用引号
#查询喜欢电影hero的用户,其中hobby是users集合中对象的一个属性,
#movies又是hobby对象的一个属性,且movies的值是一个[],
#此时会匹配喜欢的电影中有hero的用户而不是喜欢的电影等于hero的用户
db.users.find({"hobby.movies":"hero"});
Tip
:MongoDB的文档对象的属性值也可能是一个文档对象,此时成为内嵌对象,当我们以内嵌对象的属性作为查询条件时必须使用引号(单引号或者双引号)
7、查询操作符:
#大于
db.numbers.find({num:{$gt:500}});
#等于,和find({num:500})的不同之处在于如果属性值是数组的话find({num:500})的方式可以查到,
#而find({num:{$eq:500}})查不到,因此find({num:{$eq:500}})要求属性值完全等于
db.numbers.find({num:{$eq:500}});
#区间:大于40小于50
db.numbers.find({num:{$gt:40,$lt:50}});
#查询工资小于1000或大于2500的员工
db.emps.find({$or:[{sal:{$lt:1000}},{sal:{$gt:2500}}]});
8、分页:使用skip()和limit()
#符合条件的前10条
db.numbers.find().limit(10);
#符合条件的跳过前10条之后的接下来10条,即11-20
db.numbers.find().skip(10).limit(10);
#等同于
db.numbers.find().limit(10).skip(10);
Tip
:查的时候一定要注意数据类型
其他关于MongoDB的操作请参阅:官方文档
Ⅴ、排序
查询文档时默认按照_id的值升序排列,我们可以调用sort()方法自定义排序,1表升序,-1表降序,支持多级排序
#查询所有员工并按工资升序排列
db.emps.find({}).sort({sal:1});
#查询所有员工先按工资升序排列,再按员工编号降序
db.emps.find({}).sort({sal:1,empno:-1});
Tip
:在MongoDB中如果同时调用limit()、skip()、sort(),则在写的时候这三个方法的顺序可以任意,MongoDB都会先调用sort(),然后调用skip(),最后是limit()
Ⅵ:投影
类似于Mysql中的视图,给find()方法传入第二个参数,值为1时表示显示,为0时不显示,_id除非显示设置为不显示否则就会显示,不设置的字段都会显示
db.emps.find({},{ename:1,_id:0,sal:1});