Mongo的基本shell操作

Mongo的基本shell操作

    • 初始MongoDB
          • Linux 端启动 MongoDB 服务
          • 启动客户端
          • 退出客户端
          • 关闭 MongoDB 服务
    • 数据库的基本操作
          • 创建数据库
          • 删除数据库
          • 集合操作
          • 文档操作
            • 插入文档命令
            • 更新文档
            • 查询文档
            • 删除文档数据
    • MongoDB文档的高级查询操作
        • 数据的导入与导出
          • 数据导入
          • 数据导出
        • 高级查询
          • 假设有集合 hobbies 内容如下:
            • $all 匹配所有
            • $exists 判断字段是否存在
            • $mod 取模运算
            • $in 包含
            • $nin 不包含
            • $size 数组元素个数
            • 查询结果排序
          • 假设数据库有集合 student 如下:
            • $or 条件之间的或查询
            • $and 条件之间的且查询
            • $not 条件取反查询
            • 正则表达式匹配查询
            • count() 返回结果集总数
        • 游标
            • 什么是游标
            • 使用循环插入数据
            • 声明游标
            • 打印游标中的数据信息
            • 游标的使用场景

初始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 服务(把命令写入配置文件,以后启动服务就不用再输入一长串的命令,直接启动配置文件即可)。

Mongo的基本shell操作_第1张图片

启动客户端
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()方法,使输出更整齐

  • 条件查询

操作 格式 范例 关系数据库中类似的语句
等于 {:} db.stu1.find({“name”:“李小红”}).pretty() where name = ‘李小红’
小于 {:{$lt:}} db.stu1.find({“age”:{$lt:18}}).pretty() where age < 18
小于或等于 {:{$lte:}} db.stu1.find({“age”:{$lte:18}}).pretty() where age <= 18
大于 {:{$gt:}} db.stu1.find({“age”:{$gt:18}}).pretty() where age > 18
大于或等于 {:{$gte:}} db.stu1.find({“age”:{$gte:18}}).pretty() where age >= 18
不等于 {:{$ne:}} 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}})
$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}}]})
$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()

游标

什么是游标

通俗的说,游标不是查询结果,而是查询的返回资源,或者接口。通过这个接口,你可以逐条读取。就像 fopen 打开文件,得到一个资源一样,通过资源,可以一行一行的读文件。

使用循环插入数据
#我们首先插入10000条数据到集合 items,因为 mongodb 底层是 javascript 引擎,所以我们可以使用 js 的语法来插入数据:
for(var i=0;i<10000;i++)db.items.insert({_id:i,text:"Hello MongoDB"+i})

Mongo的基本shell操作_第2张图片

声明游标
#定义一个变量来保存这个游标,find 的查询结果(_id<=5)赋值给了游标 cursor 变量,代码如下:
var cursor=db.items.find({_id:{$lte:5}})
打印游标中的数据信息
  • printjson(cursor.next()) 打印下一条数据

Mongo的基本shell操作_第3张图片

  • 使用 js 的 while 语法来循环打印

Mongo的基本shell操作_第4张图片

  • 使用 for 循环打印

Mongo的基本shell操作_第5张图片

  • 使用 forEach 打印

Mongo的基本shell操作_第6张图片

游标的使用场景

我们可以在分页的情况下使用游标。

假设每页有10行,我们查询第701页,可以配合 skip() 和 limit() 来实现,具体步骤如图所示:

Mongo的基本shell操作_第7张图片

如果不想全部取出,只取出某一个,可以使用如下方法,取出数组下标,具体步骤如图所示:

在这里插入图片描述

你可能感兴趣的:(MongoDB,1024程序员节,mongodb)