第二十六章 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" }
>
今天讲了“增”、“删”和“查”,下次我们讲“改”。