Mongo的基本shell操作(大全)
Mongo的基本shell操作
- 初始MongoDB
- Linux 端启动 MongoDB 服务
- 启动客户端
- 退出客户端
- 关闭 MongoDB 服务
- 数据库的基本操作
- 创建数据库
- 删除数据库
- 集合操作
- 文档操作
- 插入文档命令
- 更新文档
- 查询文档
- 删除文档数据
- MongoDB文档的高级查询操作
- 数据的导入与导出
- 数据导入
- 数据导出
- 高级查询
- 假设有集合 hobbies 内容如下:
- $all 匹配所有
- $exists 返回(不)含有指定字段的文档
- $type - 返回指定BSON字段类型的文档
- $mod 取模运算
- $in 包含
- $nin 不包含
- $size 数组元素个数
- 查询结果排序
- 假设数据库有集合 student 如下:
- $or 条件之间的或查询
- $and 条件之间的且查询
- $nor - 既不..也不..
- $ne不等于
- $not 条件取反查询
- 正则表达式匹配查询
- count() 返回结果集总数
- $expr:表达式操作符。
- 游标
- 什么是游标
- 使用循环插入数据
- 声明游标
- 打印游标中的数据信息
- 游标的使用场景
- MongoDB 之聚合函数查询统计
- $project 修改文档结构输出
- $match 筛选文档输出
- $limit 限制文档数量输出
- $skip 跳过前 n 条文档输出
- $limit 与 $skip 可以组合使用,
- $unwind 拆分数组类型字段
- $group 分组输出
- $sort 排序输出
- MongoDB 之滴滴、摩拜都在用的索引
- 了解索引
- 索引的分类
- 索引基本操作
- **创建索引**(单字段索引)
- **查询索引**
- **删除索引**
- 常见索引的创建
- 创建复合索引
- 创建多 key 索引
- 创建哈希索引
- 文本索引的创建与使用
- 有趣的地理位置索引
- GeoJson 数据
- 创建地理位置索引
- 地理位置索引的使用
- 数据备份和恢复
- 数据备份
- mongodump 备份工具
- 使用 mongodump 备份数据
- 数据恢复
- mongorestore 恢复工具
- 使用 mongorestore 恢复数据
初始MongoDB
Linux 端启动 MongoDB 服务
在 /data 路径下创建文件夹 db_test 来存放 MongoDB 服务的数据。(数据存放位置)
cd /data #进入data路径
mkdir db_test #创建db文件夹
在 /logs 路径下创建文件夹 mongo 存放日志文件 mongod.log(文件不用创建,到时候会自动生成,但路径即文件夹必须提前创建好)。(日志文件)
mkdir /logs #创建/logs路径
cd /logs #进入log路径
mkdir mongo #创建mongo文件夹
在 /etc/mongod(没有路径就创建)路径下新建配置文件 mongod.conf,使用配置文件启动 MongoDB 服务(把命令写入配置文件,以后启动服务就不用再输入一长串的命令,直接启动配置文件即可)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T3Ga52LG-1667533051152)(Mongo.assets/image-20221024090318389.png)]
启动客户端
mongo --port 27017(端口号)
退出客户端
exit
关闭 MongoDB 服务
能连接到客户端时:
use admin #使用系统数据库admin,只有在admin数据库中才可以进行关闭服务的操作
db.shutdownServer() #关闭服务
客户端无法连接时:
查看 Mongo 相关进程 ps -ef | grep mongo
kill 和 Mongo 的服务进程 kill进程号码
数据库的基本操作
创建数据库
MongoDB安装完成后,可以通过pgrep mongo -l命令来查看是否已经启动。
在操作数据库之前,需要连接它,连接本地数据库服务器,输入命令:mongo
创建数据库命令:use Testdb
(如果数据库不存在,则创建数据库,否则切换到指定数据库)
查看所有数据库我们可以用命令:show dbs
然而并没有我们刚创建的Testdb
数据库。要想显示它,我们需要向数据库插入一些数据:db.Testdb.insert({_id:1,name:"王小明"})
:
删除数据库
MongoDB删除数据库需要先切换到该数据库中:use Testdb
然后执行删除命令:db.dropDatabase()
集合操作
MongoDB数据库中的集合相当于MySQL数据库中的表。
- 先进入指定数据库
Testdb
:use Testdb
- 显示所有集合 show collections
- 创建集合命令:db.集合名.insert()。(注意:一条数据用大括号{}括起来,多条数据用[]将所有数据括起来) 例:
db.mytest2.insert([{"name" : "王小明","sex":"男"},{"name" : "李小红","sex":"女"}])
- 查询集合命令:db.集合名.find()。
- 删除集合命令:db.集合名.drop()。
文档操作
插入文档命令
:db.集合名.insert(文档)。
document=({_id:1,name: '魏建新',sex: '男',hobbies: ['乒乓球','羽毛球'],birthday: '2002-09-12'
});db.person.insert(document)
//person是集合名,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档
更新文档
主要用到了:update()和save()方法。
用update()方法来更新person的数据,把王小明的出生日期替换成1996,命令如下:
db.person.update({birthday:"1996-02-14"},{$set:{birthday:"1996"}})
save()方法通过传入的文档来替换已有文档。
db.person.save({"_id" :1,"name" : "李小红","sex" : "女","hobbies" : ["画画","唱歌","跳舞"],"birthday" : "1996-06-14"
})
或:db.person.save(newdocument)
查询文档
pretty()
方法,使输出更整齐条件查询
操作 | 格式 | 范例 | 关系数据库中类似的语句 |
---|---|---|---|
等于 |
{<key>:<value>}
|
db.stu1.find({“name”:“李小红”}).pretty() | where name = ‘李小红’ |
小于 |
{<key>:{$lt:<value>}}
|
db.stu1.find({“age”:{$lt:18}}).pretty() | where age < 18 |
小于或等于 |
{<key>:{$lte:<value>}}
|
db.stu1.find({“age”:{$lte:18}}).pretty() | where age <= 18 |
大于 |
{<key>:{$gt:<value>}}
|
db.stu1.find({“age”:{$gt:18}}).pretty() | where age > 18 |
大于或等于 |
{<key>:{$gte:<value>}}
|
db.stu1.find({“age”:{$gte:18}}).pretty() | where age >= 18 |
不等于 |
{<key>:{$ne:<value>}}
|
db.stu1.find({“age”:{$ne:18}}).pretty() | where age != 18 |
- AND条件
find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规SQL的AND条件。如查询集合stu1中年龄为20岁的男性信息:
db.stu1.find({"age":20, "sex":"男"}).pretty()
删除文档数据
删除指定的数据:db.stu1.remove({'age':20}) //删除年龄为20的数据
删除全部数据(集合并不会删除):db.stu1.remove({})
MongoDB文档的高级查询操作
数据的导入与导出
数据导入
数据导入工具:mongoimport;
mongoimport -d Testdb1 -c score --type csv --headerline --ignoreBlanks --file test.csv
- -d Testdb1 :指定将数据导入到 Testdb1 数据库;
- -c score :将数据导入到集合 score ,如果这个集合之前不存在,会自动创建一个(如果省略 --collection 这个参数,那么会自动新建一个以 CSV 文件名为名的集合);
- –type csv :文件类型,这里是 CSV;
- –headerline :这个参数很重要,加上这个参数后创建完成后的内容会以 CSV 文件第一行的内容为字段名(导入json文件不需要这个参数);
- –ignoreBlanks :这个参数可以忽略掉 CSV 文件中的空缺值(导入json文件不需要这个参数);
- –file 1.csv :这里就是 CSV 文件的路径了,需要使用绝对路径。
数据导出
数据导出工具: mongoexport;
#导出 json 格式文件:
mongoexport -d Testdb1 -c score -o /file.json --type json
- -o /file.json :输出的文件路径/(根目录下)和文件名;
- –type json :输出的格式,默认为 json。
#导出 csv 格式的文件:
mongoexport -d Testdb1 -c score -o /file.json --type csv -f "_id,name,age,sex,major"
- -f :当输出格式为 csv 时,需要指定输出的字段名。
高级查询
假设有集合 hobbies 内容如下:
_id | name | sex | hobbies |
---|---|---|---|
1 | 小红 | 女 | 唱歌,跳舞,羽毛球 |
2 | 小明 | 男 | 唱歌,乒乓球,羽毛球 |
3 | 小亮 | 男 | 乒乓球,羽毛球 |
$all 匹配所有
#查询其中所有喜欢“唱歌”和“羽毛球”的人:
db.hobbies.find({hobbies:{$all:["唱歌","羽毛球"]})
$exists 返回(不)含有指定字段的文档
#查询 hobbies 集合中存在 age 字段的文档:
db.hobbies.find({age:{$exists:true}})
#hobbies 集合中不存在 age 字段的文档:
db.hobbies.find({age:{$exists:false}})
$type - 返回指定BSON字段类型的文档
#查询companies集合中所有homepage_url字段不为null类型的文档(提示:$not)
db.companies.find({
homepage_url:{$not:{$type:10}}
},{homepage_url:1})
了解type所表示的字符串类型,请访问:
https://www.mongodb.com/docs/manual/reference/bson-types/
$mod 取模运算
#查询 age 取模7等于4的文档:
db.hobbies.find({age:{$mod:[7,4]}})
$in 包含
#查询 age =17或 age =20的文档 :
db.hobbies.find({age:{$in:[17,20]}})
$nin 不包含
#查询 age !=17且 age !=20的文档:
db.hobbies.find({age:{$nin:[17,20]}})
$size 数组元素个数
#可以查询特定长度的数组,比如 hobbies 这一字段,查询有两个爱好的文档:
db.hobbies.find({hobbies:{$size:2}})
查询结果排序
db.collection.find().sort({_id:1}) #将查询结果按照_id升序排序
db.collection.find().sort({_id:-1}) #将查询结果按照_id降序排序
假设数据库有集合 student 如下:
_id | name | age | sex | major |
---|---|---|---|---|
1 | 王晓丽 | 19 | 女 | 计算机 |
2 | 张明 | 21 | 男 | 计算机 |
3 | 秋雅 | 20 | 女 | 播音主持 |
4 | 张欣欣 | 18 | 女 | 表演 |
$or 条件之间的或查询
#$or 表示多个查询条件之间是或的关系,比如查询性别 sex 为 男 或年龄 age 为18的文档信息:
db.student.find({$or:[{sex:"男"},{age:18}]})
$and 条件之间的且查询
#$and表示多个查询条件之间是且的关系,比如查询年龄 age 大于18且小于21(18 < age < 21)的信息:
db.student.find({$and:[{age:{$gt:18}},{age:{$lt:21}}]})
$nor - 既不…也不…
#查询companies集合中所有满足 number_of_employees字段既不大于200,也不小于100的文档,且只返回number_of_employees字段。
db.companies.find({$nor:[{number_of_employees:{$gt:200}},{number_of_employees:{$lt:100}}]},{number_of_employees:1,_id:0})
$ne不等于
#查询companies集合中所有homepage_url字段不是null类型的文档
db.companies.find({
homepage_url:{$ne:null}
},{homepage_url:1})
$not 条件取反查询
#$not 用来执行取反操作,比如查询年龄 age 大于等于20岁,然后进行取反(即查询年龄小于20岁的文档):
db.student.find({age:{$not:{$gte:20}}})
正则表达式匹配查询
#查询不符合major=计*开头文档:
db.student.find({major:{$not:/^计.*/}})
count() 返回结果集总数
#比如返回上一步正则查询到的结果集有几条:
db.student.find({major:{$not:/^计.*/}}).count()
$expr:表达式操作符。
可以用于同一文档中,字段值之间的比较
#查询routes集合中所有src_airport和dst_airport字段值相等的文档,且只返回src_airport和dst_airport字段:
db.companies.find({$expr:{$eq:["$name","$permalink"]}},{name:1,permalink:1,_id:0})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YTCtDZ1I-1667533051153)(Mongo.assets/image-20221028121348888.png)]
#查询companies集合中所有founded_year小于deadpooled_year字段值的文档,且只返回founded_year和deadpooled_year字段:
db.companies.find({$expr:{$lt:["$founded_year","$deadpooled_year"]}},
{founded_year:1,deadpooled_year:1,_id:0})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeYv3NBV-1667533051154)(Mongo.assets/image-20221028121702305.png)]
游标
什么是游标
通俗的说,游标不是查询结果,而是查询的返回资源,或者接口。通过这个接口,你可以逐条读取。就像 fopen 打开文件,得到一个资源一样,通过资源,可以一行一行的读文件。
使用循环插入数据
#我们首先插入10000条数据到集合 items,因为 mongodb 底层是 javascript 引擎,所以我们可以使用 js 的语法来插入数据:
for(var i=0;i<10000;i++)db.items.insert({_id:i,text:"Hello MongoDB"+i})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoDv1Bpf-1667533051155)(https://data.educoder.net/api/attachments/247874)]
声明游标
#定义一个变量来保存这个游标,find 的查询结果(_id<=5)赋值给了游标 cursor 变量,代码如下:
var cursor=db.items.find({_id:{$lte:5}})
打印游标中的数据信息
printjson(cursor.next()) 打印下一条数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVj7PNeE-1667533051156)(https://data.educoder.net/api/attachments/247953)]
使用 js 的 while 语法来循环打印
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjXcE1Fp-1667533051156)(https://data.educoder.net/api/attachments/247954)]
使用 for 循环打印
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42Njypch-1667533051157)(https://data.educoder.net/api/attachments/247954)]
使用 forEach 打印
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cmK492c3-1667533051158)(https://data.educoder.net/api/attachments/247956)]
游标的使用场景
我们可以在分页的情况下使用游标。
假设每页有10行,我们查询第701页,可以配合 skip() 和 limit() 来实现,具体步骤如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLiDQjoW-1667533051159)(https://data.educoder.net/api/attachments/247982)]
如果不想全部取出,只取出某一个,可以使用如下方法,取出数组下标,具体步骤如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9CpcAOL-1667533051159)(https://data.educoder.net/api/attachments/247983)]
MongoDB 之聚合函数查询统计
操作符 | 作用 |
---|---|
$project | 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档 |
$match | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作 |
$limit | 用来限制MongoDB聚合管道返回的文档数 |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档 |
$unwind | 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 |
$group | 将集合中的文档分组,可用于统计结果 |
$sort | 将输入文档排序后输出 |
$project 修改文档结构输出
有时候我们并不会用到文档的全部内容,只是使用其中几列,这时候就可以使用 $project 进行操作;或者有时候要重命名键值(列名),也可以使用 $project。
对集合 educoder 进行操作:
- 只输出作者 author 和学习人数 learning_num 信息,
_id
也不要不显示(_id
默认是显示的):
db.educoder.aggregate({$project:{_id:0,author:1,learning_num:1}})
0 为不显示,非 0 为显示。
- 重命名字段名(把 learning_num 重命名为 num):
db.educoder.aggregate({$project:{course:1,authoe:1,tags:1,num:'$learning_num'}})
$match 筛选文档输出
有时候我们要在集合中筛选出符合特定条件的文档,这时候使用 $match 便可以很快实现。
只输出作者为“李暾”的文档:
db.educoder.aggregate({$match:{author:'李暾'}})
$limit 限制文档数量输出
有时候集合中文档数量太大,我们只想选取前几行查看一下,这时候就可以用 $limit,输出前2条文档:
db.educoder.aggregate({$limit:2})
$skip 跳过前 n 条文档输出
与 limit相反,limit 相反,limit相反,skip 是跳过前 n 条文档,显示剩余文档。
将集合 educoder 中的前两条文档跳过,显示剩余文档:
db.educoder.aggregate({$skip:2})
- $skip 接受一个数字 n,表示丢弃结果集中的前 n 个文档;
$limit 与 $skip 可以组合使用,
db.educoder.aggregate([{$skip:1},{$limit:2}])#跳过第一条,显示前两条,也就是显示第2-3条文档db.educoder.aggregate([{$limit:2},{$skip:1}])#显示前两条,跳过第一条,也就是显示第2条文档
$unwind 拆分数组类型字段
将 educoder 中的 tags 字段拆分成多条,每条包含数组中的一个值:
db.educoder.aggregate({$unwind:'$tags'})
$group 分组输出
该操作比较常用,因为文档分组后利于我们的统计。比如,按照作者分组我们就可以统计出该集合总共有几个作者。
在集合 educoder 中,按作者分组:
db.educoder.aggregate({$group:{_id:'$author'}})
$sort 排序输出
按照学习人数 learning_num 降序排序输出文档:
db.educoder.aggregate({$sort:{learning_num:-1}})
- -1 代表降序排序, 1 代表升序排序。
MongoDB 之滴滴、摩拜都在用的索引
了解索引
什么是索引:
索引本质上是树,最小的值在最左边的叶子上,最大的值在最右边的叶子上,使用索引可以提高查询速度(而不用全表扫描)。
索引的原理:
对某个键按照升续或降续创建索引,查询时首先根据查询条件查找到对应的索引条目,然后找到索引条目对应的文档指针(文档在磁盘上的存储位置),根据文档指针再去磁盘中找到相应的文档,整个过程不需要扫描全表,速度比较快。
每个文档被插入集合时,如果没有给它指定索引_id
,MongoDB 会自动给它创建一个默认索引_id
,是个 ObjectId 对象。如图1所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RNKEgXfI-1667533051160)(Mongo.assets/207848.png)]
索引的分类
MongoDB 支持多种类型的索引,主要有以下几种类型:
索引类型 | 用途 |
---|---|
包括单字段索引(Single Field Index) | 针对某一键 key 创建了单字段索引,其能加速对 key 字段的各种查询请求,是最常见的索引形式,MongoDB 默认创建的 id 索引也是这种类型。 |
复合索引 (Compound Index) | 复合索引是单字索引的升级版本,它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推。 |
多 key 索引 (Multikey Index) | 当索引的字段为数组时,创建出的索引称为多 key 索引。 |
哈希索引(Hashed Index) | 按照某个字段的hash值来建立索引,目前主要用于 MongoDB Sharded Cluster 的 Hash 分片,哈希索引只能满足字段完全匹配的查询,不能满足范围查询等。 |
地理位置索引(Geospatial Index) | 能很好的解决 O2O 的应用场景,比如:查找附近的美食、查找某个区域内的车站等。 |
文本索引(Text Index) | 能解决快速文本查找的需求,比如有一个博客文章集合,需要根据博客的内容来快速查找,则可以针对博客内容建立文本索引。 |
索引基本操作
创建索引(单字段索引)
db.person.createIndex({key:1})
- key :要创建索引的键;
- 如果为 1 说明是按照升序创建索引,而如果为 -1,则是按降序创建索引。
如图2所示,说明创建索引成功:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DhdqksII-1667533051161)(Mongo.assets/207849.png)]
查询索引
- 查询集合索引:
db.person.getIndexes()
#效果如图3所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCAN9J6s-1667533051161)(Mongo.assets/207850.png)]
查询系统全部索引:
db.system.indexes.find()
删除索引
- 通过指定索引名称删除该索引:
db.person.dropIndex("ageIdx")
效果如图4所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Hmld18f-1667533051162)(Mongo.assets/207852.png)]
通过指定集合删除集合中的全部索引:
db.person.dropIndexes() #注:默认索引_id不会且不能被删除
效果如图5所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvW73KrE-1667533051163)(Mongo.assets/207851.png)]
常见索引的创建
创建复合索引
和创建单字段索引的方法差不多,只是选取了多个键一同作为索引,中间以逗号隔开:
db.person.createIndex({age: 1, name: 1})
#用法也和单字段索引差不多,就不再赘述。
创建多 key 索引
当索引的字段为数组时,创建出的索引称为多 key 索引,多 key 索引会为数组的每个元素建立一条索引,比如 person 集合加入一个 habbit 字段(数组)用于描述兴趣爱好:
{name : '王小明', age : 19, habbit: ['football', 'runnning']}
需要查询有相同兴趣爱好的人就可以利用 habbit 字段的多 key 索引。
db.person.createIndex( {habbit: 1} ) // 升序创建多key索引db.person.find({habbit: 'football'}) //查找喜欢足球的人
创建哈希索引
创建命令如下:
db.person.createIndex( { _id: 'hashed' } )
注:哈希索引涉及知识点太多,本关就不做重点介绍,以后用到再做详细解释。
文本索引的创建与使用
什么时候使用文本索引;
假如我们用 Mongodb 存储了很多博客文章,那么如何快速找到所有关于 mongodb 这个主题的文章呢?这时候就要用到文本搜索了。
有文章集合 collection,如下:
{title: 'enjoy the mongodb articles on educoder',tags: [ 'mongodb', 'educoder']}
创建文本索引命令,如下:
db.collection.createIndex({ title: 'text'})
- 创建全文本索引的字段必须为 string 格式;
- 每个集合只支持一个文本索引。
运行效果如图1所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gctu1pII-1667533051163)(Mongo.assets/208097.png)]
也可以创建多个字段的 text,下面的示例在字段主题和注释上创建一个文本索引:
db.collection.createIndex( { title:'text', tags:'text' })
使用文本索引;
现在我们已经创建了 title 的索引,我们来搜索一下含有 educoder.net 的文章:
db.collection.find({$text:{$search:'educoder.net'}})
- search 后的关键词可以有多个,关键词之间的分隔符可以是多种字符,例如空格、下划线、逗号、加号等,但不能是
-
和\
,因为这两个符号会有其他用途。搜索的多个关键字是 or 的关系,除非你的关键字包含-
; - 匹配时不是完整的单词匹配,相似的词也可以匹配到;
运行效果如图2所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ru1FYFWd-1667533051164)(Mongo.assets/208100.png)]
- search 后的关键词可以有多个,关键词之间的分隔符可以是多种字符,例如空格、下划线、逗号、加号等,但不能是
删除文本索引;
通过命令获取索引名:
db.collection.getIndexes()
删除命令:
db.collection.dropIndex('title_text')
运行效果如图3所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKWyILIS-1667533051164)(Mongo.assets/208103.png)]
有趣的地理位置索引
GeoJson 数据
并不是所有文档都可以创建地理位置索引,只有拥有特定格式的文档才可以创建。
如果我们用的是 2dsphere 索引,那么插入的应该是 GeoJson 数据。GeoJson 的格式如是: { type: ‘GeoJSON type’ , coordinates: ‘coordinates’ }
- type :指的是类型,可以是 Point (本例中用的)、LineString、 Polygon 等;
- coordinates :指的是一个坐标数组。
我们有如下几个位置的坐标信息(具体详情如图1所示),先把它们写入集合 locations 中。
db.locations.insert({_id:1,name:'长沙站',location:{type:'Point',coordinates:[113.018987,28.201215]}})db.locations.insert({_id:2,name:'湖南师范大学',location:{type:'Point',coordinates:[112.946045,28.170968]}})db.locations.insert({_id:3,name:'中南大学',location:{type:'Point',coordinates:[112.932175,28.178291]}})db.locations.insert({_id:4,name:'湖南女子学院',location:{type:'Point',coordinates:[113.014675,28.121163]}})db.locations.insert({_id:5,name:"湖南农业大学",location:{type:'Point',coordinates:[113.090852,28.187461]}})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hggevTP4-1667533051165)(Mongo.assets/207952.png)]
创建地理位置索引
有了规范的文档后,我们就可以使用以下命令,在 location 键上创建一个地理位置索引:
db.locations.createIndex({location:'2dsphere'})
- 2d :平面坐标索引,适用于基于平面的坐标计算,也支持球面距离计算,不过官方推荐使用 2dsphere 索引;
- 2dsphere :几何球体索引,适用于球面几何运算;
- 默认情况下,地理位置索引会假设值的范围是从−180到180(根据经纬度设置)。
如下索引创建成功,效果如图2所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fODaxTQy-1667533051165)(Mongo.assets/208105.png)]
地理位置索引的使用
查询命令:
db.runCommand({ geoNear:'locations', near:{type:'Point',coordinates:[113.018987,28.201215]}, spherical:true, minDistance:1000, maxDistance:8000 })
- geoNear :我们要查询的集合名称;
- near :就是基于那个点进行搜索,这里是我们的搜索点“长沙站”;
- spherical :是个布尔值,如果为 true,表示将计算实际的物理距离,比如两点之间有多少 km,若为 false,则会基于点的单位进行计算 ;
- minDistance :搜索的最小距离,这里的单位是米 ;
- maxDistance :搜索的最大距离。
查询结果分析:
在 result 中,查到了“湖南农业大学”和“湖南师范大学”,每个文档都加上了一个 dis 字段,它表示这个点离你搜索点的距离。比如说,在结果中 name 为“湖南农业大学”的点的 dis 为7215.061630510019。表示“湖南农业大学”距离搜索点“长沙站”的距离是7215米。这个结果对于 LBS 应用是非常有用的。具体详情如图3所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfYj6wr5-1667533051165)(Mongo.assets/208036.png)]
数据备份和恢复
数据备份
mongodump 备份工具
mongodump 的参数与 mongoexport(数据导出)的参数基本一致:
参数 | 参数说明 |
---|---|
-h | 指明数据库宿主机的IP |
-u | 指明数据库的用户名 |
-p | 指明数据库的密码 |
-d | 指明数据库的名字 |
-c | 指明collection的名字 |
-o | 指明到要导出的文件名 |
-q | 指明导出数据的过滤条件 |
–authenticationDatabase | 验证数据的名称 |
–gzip | 备份时压缩 |
–oplog | use oplog for taking a point-in-time snapshot |
使用 mongodump 备份数据
备份工具同导入导出工具类似,都是在命令行进行操作,无需进入客户端。
全库备份(如果数据库未设置用户和密码,可以省略 -uroot -proot 参数)
mongodump -h 127.0.0.1:27300 -uroot -proot --authenticationDatabase admin -o /home/mongod#备份本地27300端口中root用户的所有数据库到/home/mongod目录下
单个数据库备份
mongodump -h 127.0.0.1:27300 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/test#备份本地27300端口中root用户的test数据库到/home/mongod/test目录下
集合备份
mongodump -h 127.0.0.1:27300 -uroot -proot --authenticationDatabase admin -d test -c haha -o /home/mongod/test/haha#备份27300端口中root用户的test数据库的haha集合到/home/mongod/test/haha目录下
压缩备份库
mongodump -h 127.0.0.1:27300 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/test1 --gzip#压缩备份本地27300端口中root用户的test数据库到/home/mongod/test1目录下
压缩备份集合
mongodump -h 127.0.0.1:27300 -uroot -proot --authenticationDatabase admin -d test -c haha -o /home/mongod/test1/haha --gzip#压缩备份27300端口中root用户的test数据库的haha集合到/home/mongod/test1/haha目录下
数据恢复
mongorestore 恢复工具
参数 | 参数说明 |
---|---|
-h | 指明数据库宿主机的IP |
-u | 指明数据库的用户名 |
-p | 指明数据库的密码 |
-d | 指明数据库的名字 |
-c | 指明collection的名字 |
-o | 指明到要导出的文件名 |
-q | 指明导出数据的过滤条件 |
–authenticationDatabase | 验证数据的名称 |
–gzip | 备份时压缩 |
–oplog | use oplog for taking a point-in-time snapshot |
–drop | 恢复的时候把之前的集合drop掉 |
使用 mongorestore 恢复数据
全库备份中恢复单库(基于之前的全库备份)
mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod#从/home/mongod目录下恢复全部数据库的数据到本地27300端口中root用户中(基于第一关的备份,下同)
恢复 test 库
mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test /home/mongod/test#从/home/mongod/test目录下恢复名为test的单个数据库的数据到本地27300端口中root用户中的test数据库
恢复 test 库下的 haha 集合
mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test -c haha /home/mongod/test/haha/haha.bson#从/home/mongod/test/haha目录下恢复集合的数据到本地27300端口中root用户的test数据库的haha集合中
–drop 参数实践恢复
# 恢复单库mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/test# 恢复单表mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -
ongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod#从/home/mongod目录下恢复全部数据库的数据到本地27300端口中root用户中(基于第一关的备份,下同)
- 恢复 test 库
mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test /home/mongod/test#从/home/mongod/test目录下恢复名为test的单个数据库的数据到本地27300端口中root用户中的test数据库
- 恢复 test 库下的 haha 集合
mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test -c haha /home/mongod/test/haha/haha.bson#从/home/mongod/test/haha目录下恢复集合的数据到本地27300端口中root用户的test数据库的haha集合中
- --drop 参数实践恢复# 恢复单库mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/test# 恢复单表mongorestore -h 127.0.0.1:27017 -uroot -proot --authenticationDatabase admin -
Mongo的基本shell操作(大全)相关推荐
- Docker安装MoogoDB, 进入容器, mongo shell操作mongoDB
安装MoogoDB, 进入容器, mongo shell操作mongoDB [ 包含 Docker-Compose方式.普通方式 ] 文章目录 安装MoogoDB, 进入容器, mongo shell ...
- Hadoop中HDFS的Shell操作(开发重点)、启动Hadoop集群、基本语法、常用命令实操、命令大全、-help、-mkdir、-moveFromLocal、-copyFromLocal
文章目录 6.HDFS的Shell操作(开发重点) 6.1基本语法 6.2命令大全 6.3常用命令实操 6.3.1准备工作 6.3.1.1启动Hadoop集群(方便后续的测试) 6.3.1.2-hel ...
- MongoDB shell 操作
A:连接命令 E:\MongoDB\mongodb_64\bin>mongo --help MongoDB shell version: 2.4.6 usage: mongo [options] ...
- slqite3库查询数据处理方式_SQLite3命令操作大全
SQLite3命令操作大全 SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.ql ...
- MongoDB学习笔记二—Shell操作
数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{"x":null} 布尔型 布尔类型有两 ...
- HDFS的Shell操作和API操作
文章目录 HDFS的Shell操作 1.1 基本语法 1.2 命令大全 1.3 常用命令实操 1.3.1 准备工作 1.3.2 上传 1.3.3 下载 1.3.4 HDFS直接操作 第二章 HDFS客 ...
- 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)
读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...
- DOS命令操作大全和计算机运行命令(初次写请多多关照)
DOS命令操作大全和计算机运行命令 第一次写博客多多关照 写的可能会很杂 不全 DOS结束进程 根据程序名结束: taskkill /f /im xxxx.exe(程序名必须加.exe) 根据程序的P ...
- ubuntu shell命令大全
原文地址:ubuntu shell命令大全 作者:sun5411 转自:http://blog.chinaunix.net/uid-22330495-id-141752.html 前言 下面的命令大都 ...
- MongoDB基础篇:MongoDB Shell命令大全
分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 要想能熟练操作MongoDB,首先先要熟练使用 MongoDB Shell, 再次要熟练使用驱动 mongodb-java ...
最新文章
- 我在美团的这两年,想和你分享
- 中国AI登上Nature子刊:看病历分析儿科疾病,准确率90%,超人类医师
- 万向节死锁 gimbal lock
- C++实现huffman哈夫曼编码的算法(附完整源码)
- oracle24550,ORA-24550 Signal Received Error From Client Based Application
- 配置ip yum 单用户 救援 运行级别
- 大道至简第四章读后感
- PdfJS使用的一些说明
- Sketch教程|如何访问组件视图?
- 城市智能交通指挥中心系统方案
- 密码正确登入不了网络计算机,windows远程登录密码正确但登录不上
- 新东方的负载均衡架构探索和实践
- 在linux下 配置内网ip`
- Ubuntu桌面美化教程(GNOME Tweak Tool安装教程)
- 树莓派开机自启动opencv程序脚本及报错分析及拓展
- group by 和where可以一起使用吗
- 用两条命令看出你买的H3C光模块是否是正品
- 基于51单片机16*32点阵显示屏的设计与实现
- 在Silverlight3中使用SSME重现Big Buck Bunny播放器
- 路由守卫(登录_vue3)
热门文章
- 服务器管理口IP及账号密码(知识汇总)
- 压缩文件已损坏怎么办?恢复压缩文件,解决方法看这里
- pixi 小游戏_学习如何用pixi.js开发微信小游戏
- 黑客专用文本编辑器Emacs中文手册
- 好斌c语言教程,C语言学习大纲__斌(讲解).doc.doc
- Excel和WPS 下设置多种不同条件的条件格式
- fadeOut和fadeIn
- 减员云售前可降本增效
- 编写TaskMgr.exe的时候学习的知识点
- mysql保存特殊表情符_mysql 存储表情或者特殊符号