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)]

  • 删除文本索引;

    • 通过命令获取索引名:

      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操作(大全)相关推荐

  1. Docker安装MoogoDB, 进入容器, mongo shell操作mongoDB

    安装MoogoDB, 进入容器, mongo shell操作mongoDB [ 包含 Docker-Compose方式.普通方式 ] 文章目录 安装MoogoDB, 进入容器, mongo shell ...

  2. 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 ...

  3. MongoDB shell 操作

    A:连接命令 E:\MongoDB\mongodb_64\bin>mongo --help MongoDB shell version: 2.4.6 usage: mongo [options] ...

  4. slqite3库查询数据处理方式_SQLite3命令操作大全

    SQLite3命令操作大全 SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.ql ...

  5. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{"x":null} 布尔型 布尔类型有两 ...

  6. 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客 ...

  7. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  8. DOS命令操作大全和计算机运行命令(初次写请多多关照)

    DOS命令操作大全和计算机运行命令 第一次写博客多多关照 写的可能会很杂 不全 DOS结束进程 根据程序名结束: taskkill /f /im xxxx.exe(程序名必须加.exe) 根据程序的P ...

  9. ubuntu shell命令大全

    原文地址:ubuntu shell命令大全 作者:sun5411 转自:http://blog.chinaunix.net/uid-22330495-id-141752.html 前言 下面的命令大都 ...

  10. MongoDB基础篇:MongoDB Shell命令大全

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 要想能熟练操作MongoDB,首先先要熟练使用 MongoDB Shell, 再次要熟练使用驱动 mongodb-java ...

最新文章

  1. 我在美团的这两年,想和你分享
  2. 中国AI登上Nature子刊:看病历分析儿科疾病,准确率90%,超人类医师
  3. 万向节死锁 gimbal lock
  4. C++实现huffman哈夫曼编码的算法(附完整源码)
  5. oracle24550,ORA-24550 Signal Received Error From Client Based Application
  6. 配置ip yum 单用户 救援 运行级别
  7. 大道至简第四章读后感
  8. PdfJS使用的一些说明
  9. Sketch教程|如何访问组件视图?
  10. 城市智能交通指挥中心系统方案
  11. 密码正确登入不了网络计算机,windows远程登录密码正确但登录不上
  12. 新东方的负载均衡架构探索和实践
  13. 在linux下 配置内网ip`
  14. Ubuntu桌面美化教程(GNOME Tweak Tool安装教程)
  15. 树莓派开机自启动opencv程序脚本及报错分析及拓展
  16. group by 和where可以一起使用吗
  17. 用两条命令看出你买的H3C光模块是否是正品
  18. 基于51单片机16*32点阵显示屏的设计与实现
  19. 在Silverlight3中使用SSME重现Big Buck Bunny播放器
  20. 路由守卫(登录_vue3)

热门文章

  1. 服务器管理口IP及账号密码(知识汇总)
  2. 压缩文件已损坏怎么办?恢复压缩文件,解决方法看这里
  3. pixi 小游戏_学习如何用pixi.js开发微信小游戏
  4. 黑客专用文本编辑器Emacs中文手册
  5. 好斌c语言教程,C语言学习大纲__斌(讲解).doc.doc
  6. Excel和WPS 下设置多种不同条件的条件格式
  7. fadeOut和fadeIn
  8. 减员云售前可降本增效
  9. 编写TaskMgr.exe的时候学习的知识点
  10. mysql保存特殊表情符_mysql 存储表情或者特殊符号