欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MongoDB数据库,集合,文档查询

程序员文章站 2022-06-19 08:23:15
...

MongoDB数据库,集合文档查询

数据库相关操作

显示所有数据库

show dbs;

创建,连接数据库

use database_name;

显示当前连接的数据库

db;

删除数据库

db.dropDatabase();->注意这里是删除的当前连接的数据库

集合相关操作

显示当前数据库下所有集合

show collections;

创建集合

  1. 隐式创建

MongoDB数据库,集合,文档查询

注意隐式创建集合的时候insert()括号里不能为空,否则报错
  1. 显示创建

MongoDB数据库,集合,文档查询

删除集合

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"});//删多条