MongoDB数据库,集合文档查询
数据库相关操作
显示所有数据库
show dbs;
创建,连接数据库
use database_name;
显示当前连接的数据库
db;
删除数据库
db.dropDatabase();->注意这里是删除的当前连接的数据库
集合相关操作
显示当前数据库下所有集合
show collections;
创建集合
- 隐式创建
注意隐式创建集合的时候insert()括号里不能为空,否则报错
- 显示创建
删除集合
db.a.drop();->删除集合a
文档相关操作
文档查询
查询所有字段信息
db.a.find();
查询特定字段信息
db.a.find({item:'电影票'},{name:1,price:1,_id:0});
/*这里第一个{}表示查询的条件,比如查询某个字段下的某个内容
第二个{}表示你想要显示的字段,'1'表示显示,'0'表示不显示
上面指令的意思就是查询字段为item下的所有电影票文档,只显示name和price字段,不显示_id字段(如果不写_id,系统会默认自己显示)*/
db.a.find({},{name:0,price:0});
/*第一个{}为空表示查询所有文档,第二个{}里面name,price字段为0,表示除了这2个字段不显示,其他都显示*/
find()如果跟2个参数,那么每个参数都是文档类型
第一个参数表示查询条件
第二个参数表示显示的内容
排序显示
单字段排序
db.a.find().sort({price:1});
表示以价格升序排序
1代表升序,-1代表降序
多字段排序
db.a.find().sort({price:1,stocks:-1});
表示以价格升序,库存量降序
注意:这里有前后之分,要先按price排序,再按stocks排序,且stocks的降序是建立在price升序之上,也就是说当price排序完有重复的文档时,才会按stocks降序
空值查询
比如现在有这样的一个情景,我在a中插入3个文档,
第一个文档字段item为空值
第二个文档直接没有item这个字段
第三个文档有item字段,且里面还有个值
db.a.insert([
{_id:1,item:null},
{_id:2},
{_id:3,item:'computer'}
]);
1.现在我要查询item为null的文档,可以如下:
db.a.find({item:{$type:10}});
10在MongoDB中代表null值
2.我要查询没有item这个字段的文档,可以如下:
db.a.find({item:{$exists:false}});
使用操作符$exists
false表示没有该字段,true表示有
分组统计
使用聚合函数aggregate()和操作符$group
没有额外条件的分组
如:将商品按item分组,统计各组库存量的和
db.a.aggregate(
{$group:{_id:"$item",total:{$sum:"$stocks"}}}
);
_id:后面接你要分组的字段
total是随便起的一个名字(和),并不是格式要求
$sum:"stocks"表示对库存量stocks求和
有其他条件的分组
需要使用操作符**$match**
什么叫有其他条件,比如说上面那个例子,
我再在此基础上,还要统计出价格在50到80之间的文档,如下:
db.a.aggregate(
{$match:{price:{$lte:80,$gte:50}}},
{$group:{_id:"$item",total:{$sum:"$stocks"}}}
);
注意这里的格式
第一个{}表示匹配的条件(也就是分组后的条件),
第二个{}表示分组的条件
特别注意:
当$sum后面求和的字段其类型为整型时,很容易理解,就是将其中的数值求和就行了
当$sum后面求和的字段是字符型时,我们可以写一个1,表示以1为计量单位,对这条文档的这个字段下的内容计数
如:
db.a.aggregate(
{$group:{_id:"$item",total:{$sum:1}}}
);
文档数组查询
文档数组,就是一个数组,里面的元素都是文档类型
比如有一个字段test,该字段下的内容就是文档数组
第一种查询方法:
db.a.find({test:{name:'A',price:25}});
这种查询指查找test字段中文档数组里某个元素为{name:‘A’,price:25}的文档,{name:‘A’,price:25}的内容要完全一致,顺序不能变
第二种查询方法:
db.a.find({test:{$elemMatch:{name:'A',price:25}}});
这一次加了操作符$elemMatch,表示只要该文档数组里有这个元素就行,不管顺序如何(name和price这2个键还是要有的)
查询某个文档的文档数组里的某个元素的某个字段
(有点绕…)
意思就是比如说我现在要求显示test里的第一个元素的price:
db.a.find({},{"test.0.price":1,_id:0});
不管是第几个元素,显示所有元素的price:
db.a.find({},{"test.price":1,_id:0});
注意:内嵌文档,数组元素,都需要放在引号内
文档更新
update() 更新一个文档
updateMany() 更新多个或所有文档
该函数通常跟2个参数,
第一个参数为要更新的字段
第二个参数为要更新的条件
$set
更新,新建字段
更新一个文档
db.a.update({item:'paper'},{$set:{price:15}});
注意:如果这里不加$set,那么会将该文档的所有字段全改为price!
更新多个文档
db.a.updateMany({},{$set:{price:20}});
将所有文档的price改为20
这2个地方的$set都有两重含义:
1.如果有该字段(price),那么直接将其更新
2.如果没有该字段(price),那么会先创建该字段,也就是新加字段,然后赋予其初始值
$unset
删除字段
db.a.updateMany({},{$unset:{price:1}});
1表示删除字段price,或者用“”代替(引号里什么也没有)
$inc
db.a.updateMany({},{$inc:{price:5}});
表示所有价格上涨5,改为-5表示下降
文档删除
deleteOne() 删一条文档
deleteMany() 删多条或全部文档
db.a.deleteOne({item:"movie"});//删一条
db.a.deleteMany({item:"movie"});//删多条