爬虫(28)mongodb(上)

本文详细介绍了MongoDB的安装过程、环境变量配置、启动和连接命令。接着,阐述了MongoDB的基本操作,包括查看和使用数据库、插入数据、删除数据库以及集合的创建与管理。此外,文章还探讨了数据查询,如多条件查询、范围查询、逻辑条件查询和自定义条件查询,并讲解了如何操作查询结果,如计数、limit、skip、映射和排序等。
摘要由CSDN通过智能技术生成

第二十六章 mongodb的简介与基本命令

1. mongodb的简介

特别像关系型的非关系型数据库,保存数据非常灵活。mysoql需要建库建表,而mongodb不需要,它的里面是集合,集合代替了表。优势:

  • 无数据结构的限制,业务开发非常方便
  • 大数据量和高性能,非关系型数据库都具有非常高的读写性能,尤其在大数量下表现优秀
  • 良好的支持,官网有完善的文档可提供学习,跨平台性比较好,多种系统都可以安装

1.1 mongodb的安装

官网上有学习文档,有下载社区。

在这里插入图片描述
下载对应系统版本的msi文件到本地的一个文件见,然后双击安装:
在这里插入图片描述
在这里插入图片描述
默认安装到C盘,后面的两个路径一定要有。
在这里插入图片描述
在这里插入图片描述
等到半分钟,安装完毕
在这里插入图片描述
安装完成。

1.2 添加环境变量

安装完成后要把这个路径添加到path环境变量里面:
C:\Program Files\MongoDB\Server\4.4\bin
右键“我的电脑”>属性>高级系统设置
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
然后所有打开的窗口全部点“确定”

1.3 启动命令

mongod --dbpath C:\Program Files\MongoDB\Server\4.4\data  # 后面跟的是data路径,不同人的是不同的

这个界面说明已经启动成功。

1.3 连接命令

连接命令更简单,直接

mongo

在这里插入图片描述
这个界面说明已经连接成功。

2. mongodb的基本命令

2.1 查看数据库

show dbs

在这里插入图片描述
当前的数据库一共有三个,是mongodb自带的数据库:

admin  
config  
local 


2.2 使用某个数据库

下面我们尝试使用admin这个数据库

> use admin
switched to db admin
>

我们输入db命令查看一下当前使用的数据库:

> db
admin
>

显示出admin是当前数据库。use命令还可以创建新的数据库,如:

> use demo
switched to db demo
>


因为自带的没有demo这个数据库,所以当输入use demo时,就自动创建了一个新的数据库,我们查看一下

> db
demo
>

我们看到正在使用的就是demo数据库。但是如果我们用show dbs命令,却没有这个demo数据库。

> use demo
switched to db demo
> db
demo
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>



这是因为我们刚才创建的demo数据库只放在了内存当中,并且因为里面没有数据,并没有放在硬盘当中。所以可以通过db看到,但是不能通过show dbs看到。

2.3 添加数据

下面我们可以向里面添加一条数据。

> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
demo    0.000GB
local   0.000GB
>

我们再show dbs里面就有了demo数据库。

2.4 查看数据库表

我们再看admin里面有没有一张表,因为每个数据库里面都有一张表。

> use admin
switched to db admin
> show collections
system.version
>

所以我们看到了,里面有个系统版本的表。还可以通过show tables

> use admin
switched to db admin
> show collections    # 查看集合
system.version
> show tables        # 查看表,和show collections 等价
system.version
>

2.5 删除数据库

我们切换到demo,然后使用删除命令来删除这个库

> db.dropDatabase()
{ "dropped" : "demo", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
>

我们再show dbs就没有了demo

3.集合的基本命令

在mongodb中建表可以手动建表,可以不手动建表。我向一个不存在的集合添加数据,这个集合就会被创建出来,这是不手动创建。

3.1 自动建表

> use demo
switched to db demo
> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
>

下面查看一下,

> use demo
switched to db demo
> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> show tables
jerry

这就是不手动建表。下面我们show dbs一下:

> show dbs
admin   0.000GB
config  0.000GB
demo    0.000GB
local   0.000GB
>


出现了demo,但是里面没有显示数据变化,这是因为我们仅插入一条数据,而显示是以GB为单位的,所以显示不出来。

3.2 手动建表

也可以手动创建集合,命令是:

db.createCollection(name,options)  # 传入一个集合的名字, options是可选参数,是指传入数据大小限制,如果不设置默认为False,就是没有上限,如果设置为True就是有上限。

下面我们手动创建一个集合jerry_collection

> db.createCollection('jerry_collecton')
{ "ok" : 1 }
> show tables
jerry
jerry_collecton
>

下面我们向集合中多添加几条数据:

> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> db.jerry.insert({x:1})
WriteResult({ "nInserted" : 1 })
> db.jerry.find()  # 查找所有数据
{ "_id" : ObjectId("60752434fe8b060d8a3fbfc2"), "x" : 1 }
{ "_id" : ObjectId("6075250cfe8b060d8a3fbfc3"), "x" : 1 }
{ "_id" : ObjectId("6075251cfe8b060d8a3fbfc4"), "x" : 1 }
{ "_id" : ObjectId("60752531fe8b060d8a3fbfc5"), "x" : 1 }
{ "_id" : ObjectId("60752543fe8b060d8a3fbfc6"), "x" : 1 }
{ "_id" : ObjectId("60752557fe8b060d8a3fbfc7"), "x" : 1 }


3.3 插入数据限制

我们看到这个可以无限插入数据,我们也可以设置一个有限制的,比如让数据插入数设置为4

> db.createCollection('jerry1',{capped:true,size:4})
{ "ok" : 1 }
>


下面我们尝试在这个集合里面插入数据看能插入几条:

@(shell):1:1
> db.createCollection('jerry1',{capped:true,size:4})
{ "ok" : 1 }
> db.jerry1.insert({name:'jerry1'})
WriteResult({ "nInserted" : 1 })
> db.jerr1.insert({name:'jerry2'})
WriteResult({ "nInserted" : 1 })
> db.jerr1.insert({name:'jerry3'})
WriteResult({ "nInserted" : 1 })
> db.jerr1.insert({name:'jerry4'})
WriteResult({ "nInserted" : 1 })
> db.jerr1.insert({name:'jerr5'})
WriteResult({ "nInserted" : 1 })
> db.jerry.find()
{ "_id" : ObjectId("60752434fe8b060d8a3fbfc2"), "x" : 1 }
{ "_id" : ObjectId("6075250cfe8b060d8a3fbfc3"), "x" : 1 }
{ "_id" : ObjectId("6075251cfe8b060d8a3fbfc4"), "x" : 1 }
{ "_id" : ObjectId("60752531fe8b060d8a3fbfc5"), "x" : 1 }
{ "_id" : ObjectId("60752543fe8b060d8a3fbfc6"), "x" : 1 }
{ "_id" : ObjectId("60752557fe8b060d8a3fbfc7"), "x" : 1 }

其实这个size代表的是字节,在mongodb中默认最小存储256字节,4小于256当然就默认为256字节。
我们多添加几条看看:

> db.jerry1.insert({name:'jerry1'})
WriteResult({ "nInserted" : 1 })
> db.jerry1.insert({name:'jerry2'})
WriteResult({ "nInserted" : 1 })
>  db.jerry1.insert({name:'jerry3'})
WriteResult({ "nInserted" : 1 })
>  db.jerry1.insert({name:'jerry4'})
WriteResult({ "nInserted" : 1 })
>  db.jerry1.insert({name:'jerry5'})
WriteResult({ "nInserted" : 1 })
>  db.jerry1.insert({name:'jerry6'})
WriteResult({ "nInserted" : 1 })
>  db.jerry1.insert({name:'jerry7'})
WriteResult({ "nInserted" : 1 })
> db.jerry1.find()
{ "_id" : ObjectId("60752a3afe8b060d8a3fbfce"), "name" : "jerry2" }
{ "_id" : ObjectId("60752ae8fe8b060d8a3fbfd0"), "name" : "jerry3" }
{ "_id" : ObjectId("60752af2fe8b060d8a3fbfd1"), "name" : "jerry4" }
{ "_id" : ObjectId("60752af9fe8b060d8a3fbfd2"), "name" : "jerry5" }
{ "_id" : ObjectId("60752b03fe8b060d8a3fbfd3"), "name" : "jerry6" }
{ "_id" : ObjectId("60752b0dfe8b060d8a3fbfd4"), "name" : "jerry7" }
>

我们看到,当存储数据超出256字节,后面存入的数据就将之前的数据挤出去了。
我们最好不要设置限制。我们要查看别人的数据库有没有上限,可以用以下命令:

> db.jerry1.isCapped()
true
> db.jerry.isCapped()
false
>



返回true代表有上限,false代表没有上限。
下面我们查看demo数据库里一共有多少表

> show tables
jerr1
jerry
jerry1
jerry_collection
>

3.4 删除表

下面我们想把那个最长的删去。

> db.jerry_collection.drop()  # 删除表
true
> show tables
jerr1
jerry
jerry1
>

我们看到了,最后删除了jerry_collection这张表。
总结:数据库命名规范

  • 不能是空的字符串
  • 不能含有特殊字符
  • 全部用小写
  • 不能和系统保留的数据库重名
  • 最多64个字节

4. 插入数据

学习数据库就是增、删、改、查,我们来看mongodb的插入数据。

4.1 插入

db.集合名.insert({})  花括号是json数据格式

实例:

> db.jerry2.insert({name:'jerry',age:18,gender:'male'})
WriteResult({ "nInserted" : 1 })
> db.jerry2.find()
{ "_id" : ObjectId("60753b6afe8b060d8a3fbfd5"), "name" : "jerry", "age" : 18, "gender" : "male" }
>

我们也可以手动添加id,但是id是不能够重复的:

> db.jerry2.find()
{ "_id" : ObjectId("60753b6afe8b060d8a3fbfd5"), "name" : "jerry", "age" : 18, "gender" : "male" }
{ "_id" : 1, "name" : "jerry1", "age" : 19, "gender" : "male" }
>

我们看到新添加的数据id就是我们命定的,不是系统生成的。

如果要一次插入多条数据,我们加上中括号就可以了。

> db.jerry2.insert([{name:'jerry2',age:20,gender:'male'},{name:'jerry3',age:21,gender:'male'}])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
> db.jerry2.find()
{ "_id" : ObjectId("60753b6afe8b060d8a3fbfd5"), "name" : "jerry", "age" : 18, "gender" : "male" }
{ "_id" : 1, "name" : "jerry1", "age" : 19, "gender" : "male" }
{ "_id" : ObjectId("60753de5fe8b060d8a3fbfd6"), "name" : "jerry2", "age" : 20, "gender" : "male" }
{ "_id" : ObjectId("60753de5fe8b060d8a3fbfd7"), "name" : "jerry3", "age" : 21, "gender" : "male" }


我们看到后面有我们添加的两条数据"jerry2"和"jerry3"。中括号代表添加数组。
下面我们看数据更新的命令

4.2 更新

命令

 db.集合名.save()

下面我们在一个集合里面使用一下,我们先用cls命令清一下命令行的屏幕:

> db.jerry.find()
{ "_id" : ObjectId("60752434fe8b060d8a3fbfc2"), "x" : 1 }
{ "_id" : ObjectId("6075250cfe8b060d8a3fbfc3"), "x" : 1 }
{ "_id" : ObjectId("6075251cfe8b060d8a3fbfc4"), "x" : 1 }
{ "_id" : ObjectId("60752531fe8b060d8a3fbfc5"), "x" : 1 }
{ "_id" : ObjectId("60752543fe8b060d8a3fbfc6"), "x" : 1 }
{ "_id" : ObjectId("60752557fe8b060d8a3fbfc7"), "x" : 1 }
>  


我们查找到了,这个是这样的。
下面我改一下第一条数据并更新:

> db.jerry.find()
{ "_id" : ObjectId("60752434fe8b060d8a3fbfc2"), "x" : 1 }
{ "_id" : ObjectId("6075250cfe8b060d8a3fbfc3"), "x" : 1 }
{ "_id" : ObjectId("6075251cfe8b060d8a3fbfc4"), "x" : 1 }
{ "_id" : ObjectId("60752531fe8b060d8a3fbfc5"), "x" : 1 }
{ "_id" : ObjectId("60752543fe8b060d8a3fbfc6"), "x" : 1 }
{ "_id" : ObjectId("60752557fe8b060d8a3fbfc7"), "x" : 1 }
>  db.jerry.save({_id: ObjectId("60752434fe8b060d8a3fbfc2"),name:'jerry4',age:22,gender:'male'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.jerry.find()
{ "_id" : ObjectId("60752434fe8b060d8a3fbfc2"), "name" : "jerry4", "age" : 22, "gender" : "male" }
{ "_id" : ObjectId("6075250cfe8b060d8a3fbfc3"), "x" : 1 }
{ "_id" : ObjectId("6075251cfe8b060d8a3fbfc4"), "x" : 1 }
{ "_id" : ObjectId("60752531fe8b060d8a3fbfc5"), "x" : 1 }
{ "_id" : ObjectId("60752543fe8b060d8a3fbfc6"), "x" : 1 }
{ "_id" : ObjectId("60752557fe8b060d8a3fbfc7"), "x" : 1 }
>                                                                                                                                            


我们看到第一条数据的内容被改变了。如果我不是根据原有的id来更新的话,就相当于插入一个新的数据,系统会自动生成新id。

> db.jerry.save({name:'jerry5',age:23,gender:'male'})
WriteResult({ "nInserted" : 1 })
> db.jerry.find()
{ "_id" : ObjectId("60752434fe8b060d8a3fbfc2"), "name" : "jerry4", "age" : 22, "gender" : "male" }
{ "_id" : ObjectId("6075250cfe8b060d8a3fbfc3"), "x" : 1 }
{ "_id" : ObjectId("6075251cfe8b060d8a3fbfc4"), "x" : 1 }
{ "_id" : ObjectId("60752531fe8b060d8a3fbfc5"), "x" : 1 }
{ "_id" : ObjectId("60752543fe8b060d8a3fbfc6"), "x" : 1 }
{ "_id" : ObjectId("60752557fe8b060d8a3fbfc7"), "x" : 1 }
{ "_id" : ObjectId("6075420efe8b060d8a3fbfd8"), "name" : "jerry5", "age" : 23, "gender" : "male" }

5. mongodb查询

如果我们要在一个数据库中查询想要的数据信息怎么操作呢?
之前我们介绍过

show dbs  # 查询所有的数据库
show tables/collection  # 查询列表

下面我们介绍两个条件查询:

show.集合名.find('添加条件')
db.集合名.find({'包含的内容'})
db.集合名.find({'包含的内容'}).pretty()  格式化的查询

我们添加一个新的集合并查询:

@(shell):1:22
> db.stu.insert({name:'张三',age:17,hometown:'长沙',gender:'male'})
WriteResult({ "nInserted" : 1 })
> db.stu.insert({name:'李四',age:18,hometown:'武汉',gender:'male'})
WriteResult({ "nInserted" : 1 })
> db.stu.insert({name:'王二',age:29,hometown:'广州',gender:'male'})
WriteResult({ "nInserted" : 1 })
> db.stu.insert({name:'Jerry',age:30,hometown:'长沙',gender:'male'})
WriteResult({ "nInserted" : 1 })
> db.stu.find()
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
>                                                                                                                                                                               

查询

> db.stu.find({name:'Jerry'})
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
>  db.stu.find({name:'Jerry'}).pretty()
{
        "_id" : ObjectId("60754744fe8b060d8a3fbfdc"),
        "name" : "Jerry",
        "age" : 30,
        "hometown" : "长沙",
        "gender" : "male"
}
>  

格式化查询更漂亮一些。也可以通过命令findOne

> db.stu.findOne()
{
        "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"),
        "name" : "张三",
        "age" : 17,
        "hometown" : "长沙",
        "gender" : "male"
}
>   

我们看到第一条找到了,用格式化的方式显示的。也可以条件查询:

}
> db.stu.find({hometown:'长沙'})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
>

符合hometown:'长沙’条件的一共两个数据,分别是张三和Jerry。

如果我们把findOne()里面添加条件,就会把符合条件的第一个数据找出来。

> db.stu.findOne({hometown:'长沙'})
{
        "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"),
        "name" : "张三",
        "age" : 17,
        "hometown" : "长沙",
        "gender" : "male"
}

5.1 多条件查询

}
> db.stu.find({age:30,hometown:'长沙'})
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
>      

5.2 范围查询

符合这两个条件的只有Jerry,可以多添加几个条件精确查找。

等于:默认是等于,没有运算符
小于:$lt
小于等于:$lte
大于:$gt
大于等于:$gte

下面我们操作一下,查询年龄小于等于19,家乡在长沙的:

WriteResult({ "nInserted" : 1 })
> db.stu.find()
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
> db.stu.find({age:{$lte:19},hometown:'长沙'})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
>
# 为了多些选项我又添加了两条数据进去

注意: db.stu.find({age:{$lte:19},hometown:‘长沙’})“家乡”和“年龄”在一个级别,所以在同一个花括号中。

5.3 逻辑条件查询

逻辑条件就是and,or,not,其中上面演示的其实就是and,家乡和年龄一同作为条件来选择。下面我们说一下or,我们选择年龄小于等于19and家乡在长沙的,或者性别为女性的。

> db.stu.find()
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
> db.stu.find({$or:[{age:{$lte:19}},{hometown:'长沙'}]})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
>                           

主要是这一句:> db.stu.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{age:{lte:19}},{hometown:‘长沙’}]})
条件的面前有个$or: 后面是中括号,中括号里面罗列的条件都是或的关系,并且分别用花括号括起来。

5.4 自定义条件查询

monge shell是一个js的执行环境,使用$where写一个函数,返回满足条件的数据。
比如查询年龄大于19的学生:

> db.stu.find({$or:[{age:{$lte:19}},{hometown:'长沙'}]})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
> db.stu.find({$where:function(){return this.age>19;}})
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
>                           

也可以用in来查询年龄从17-19范围内的:


> db.stu.find({age:{$in:[17,19]}})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
> db.stu.find({age:{$in:[17,18,19]}})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }

注意:in后面是一个列表,只有age的值在这个列表内的数据才会被选出。

6. mongodb操作查询结果

C:\Users\MI>mongod --dbpath C:\Program Files\MongoDB\Server\4.4\data  # 开启数据库的命令

我们查询到的结果目的是用来操作的,我们可以操作我们查询到的结果。

6.1 计数

count() 方法用来计数,用法如下:

> db.stu.find()
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
> db.stu.find().count()
6

我们看最后一句,返回值为6,前面我们数一下,是六个数据。也可以直接写:

> db.stu.count()
6

返回值也是6,这样也是可以的。我们也可以加上条件查找,比如我们查找女的有几个。

> db.stu.find({gender:'female'}).count()
2
>

我们看到返回值为2,说明女人有两个。也可以这样写:

> db.stu.count({gender:'female'})
2
>

6.2 limit和skip

limit用来读取指定数量的文档

db.stu.find().limit(2)

skip用来跳过指定数量的文档

db.stu.find().skip(2)

也可以一起使用

db.stu.find().skip(2).limit(2)

比如在Stu中我只想读取前两个

> db.stu.find().limit(2)
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }


我想跳过前两个

> db.stu.find().skip(2)
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
>


我只想要amy

> db.stu.find().skip(4).limit(1)
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
>

先逃过了4个,然后只读取一个。

6.3 映射

映射可以指定返回的字段,值为1则返回该字段,值为0则除了该字段返回其余所有字段。如,我只想要年龄的字段,可以这样写:

> db.stu.find({},{age:1})
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "age" : 17 }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "age" : 18 }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "age" : 29 }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "age" : 30 }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "age" : 18 }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "age" : 19 }
>


我们发现默认带上了id,如果想去掉id这样写:

> db.stu.find({},{age:1,_id:0})
{ "age" : 17 }
{ "age" : 18 }
{ "age" : 29 }
{ "age" : 30 }
{ "age" : 18 }
{ "age" : 19 }

也可以多个条件一起,比如我们选出女性,家乡长沙,年龄,而且只要这两个数据

> db.stu.find({gender:'female'},{age:1,hometown:1})
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "age" : 18, "hometown" : "长沙" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "age" : 19, "hometown" : "长沙" }
>

因为_id是主key,所以默认是带上的,也可以用上面提到的方法去掉。

6.4 排序

也可以给数据排序,有升序(1)和降序(-1)。

db.stu.find().sort(age:1)   # 按照年龄升序
db.stu.find().sort(age:-1)  # 按照年龄降序

例如:

> db.stu.find().sort({age:1})   # 按照年龄升序
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }

> db.stu.find().sort({age:-1})    # 按照年龄降序
{ "_id" : ObjectId("60754744fe8b060d8a3fbfdc"), "name" : "Jerry", "age" : 30, "hometown" : "长沙", "gender" : "male" }
{ "_id" : ObjectId("6075472afe8b060d8a3fbfdb"), "name" : "王二", "age" : 29, "hometown" : "广州", "gender" : "male" }
{ "_id" : ObjectId("607554e5d5dcd8aec2e26f44"), "name" : "anny", "age" : 19, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607546fdfe8b060d8a3fbfda"), "name" : "李四", "age" : 18, "hometown" : "武汉", "gender" : "male" }
{ "_id" : ObjectId("60755423fe8b060d8a3fbfdd"), "name" : "amy", "age" : 18, "hometown" : "长沙", "gender" : "female" }
{ "_id" : ObjectId("607546d0fe8b060d8a3fbfd9"), "name" : "张三", "age" : 17, "hometown" : "长沙", "gender" : "male" }
>

今天讲了“增”、“删”和“查”,下次我们讲“改”。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值