美文网首页区块链入门
【MongoDB快速入门】第四篇 数据库常用操作

【MongoDB快速入门】第四篇 数据库常用操作

作者: 海阳之新 | 来源:发表于2019-04-21 21:45 被阅读13次

上一篇:【MongoDB快速入门】第三篇 Windows下安装MongoDB


前言

基于mongDB v4.0.9,本文以windows下操作为例。

一、进入cli客户端

D:\Program Files\MongoDB\Server\4.0\bin>mongo

也可以借助可视化软件Navicat 12+操作以下命令,安装Navicat参考:https://blog.csdn.net/fxbin123/article/details/82698217

二、查看所有数据库

show dbs

返回:

admin   0.000GB
local   0.000GB

以上数据库为系统自带数据库,admin为系统权限管理数据库,当Mongod启用auth选项时,用户需要创建数据库帐号,访问时根据帐号信息来鉴权,而数据库帐号信息就存储在admin数据库下。local数据库主要存储副本集的配置信息、oplog信息,这些信息是每个Mongod进程独有的,不需要同步到副本集种其他节点。

三、查看当前选择的数据库

db

返回:

test

四、打开或创建数据库

use db_mongo

打开数据库,如果不存在,自动创建一个。
刚创建的数据库,如果没有集合(表)或文档(记录),通过show dbs是不能查看到的。

注意: 在 MongoDB 中,集合只有在内容插入后才会创建。就是说,创建集合(表)后要再插入一个文档(记录),集合才会真正创建。

五、创建集合(表)

db.createCollection("tb_user")

返回:

{ "ok" : 1 }

六、查看集合(表)

show collections
//或者 show tables

返回:

tb_user

七、插入文档(记录)

document =({
    name: '欧阳', 
    sex: '男',
    height: 175,
    job: '软件工程师',
    url: 'http://www.xxx.com',
    tags: ['宅男', '程序猿', '吃货'],
});
db.tb_user.insert(document)

可以将json先赋值给一个变量,再插入,也可以直接插入json对象。
返回:

WriteResult({ "nInserted" : 1 })

可以参照文章末尾附件,将测试数据插入到集合(表)中,以方便接下来的操作。

八、查看所有或一条文档(记录)

在mongodb中,find()相当于MySQL中的select...操作,findOne相当于select top 1...。以下第三、四条语句在后面小节中详解。

db.tb_user.find()
db.tb_user.findOne() //查询一条文档(记录)
db.tb_user.find().limit(10).skip(10) //相当于查询第二页
db.tb_user.find({},{"name":1,_id:0, height:1}).sort({"height":-1}).limit(10).skip(0) //一条完整的查询语句,按身高`height`降序排列,只显示名字和身高`height`列,且只显示第一页10条

九、条件查询文档(记录)

  • 条件查询符表示:
  • (=) 等于 - $eq(全称:equal)
  • (!=) 不等于 - $ne(全称:not equal)
  • (>) 大于 - $gt (全称:greater than)
  • (<) 小于 - $lt (全称:less than)
  • (>=) 大于等于 - $gte(全称:gt equal)
  • (<=) 小于等于 - $lte (全称:lt equal)

1、等于查询:按_id来查询
说明:注意_id值必须是一个Object类型,第一个json表示查询条件,第二个json表示显示哪些字段(1表示显示,0表示不显示),.pretty()仅用在cli模式下,将字段一行显示一个,相当于MySQL在cli模式下给语句后面加上\G

db.tb_user.find({"_id":ObjectId("5cbab50a916d7f671c7b416a")}).pretty()

2、小于查询:身高height小于175的文档(记录)

db.tb_user.find({"height":{$lt:175}})

3、小于等于查询:身高height小于等于175的文档(记录)

db.tb_user.find({"height":{$lte:175}})

4、大于查询:身高height大于175的文档(记录)

db.tb_user.find({"height":{$gt:175}})

5、大于等于查询:身高height大于等于175的文档(记录)

db.tb_user.find({"height":{$gte:175}})

6、不等于查询:身高height不等于175的文档(记录)

db.tb_user.find({"height":{$ne:175}})

7、and查询:身高height等于175,且性别等于男的文档(记录)

db.tb_user.find({"height":175, "sex":"男"})

8、or查询:身高height等于175,或者性别等于男的文档(记录)

db.tb_user.find(
    {
         $or:[{"height":175}, {"sex":"男"}]
    }
)

9、and和or一起使用:身高height大于等于175小于180,且姓名等于欧阳或性别等于男

db.tb_user.find(
     {
        "height":{$gte:175, $lt:180}, 
        $or:[{"name":"欧阳"}, {"sex":"男"}]
     }
)

10、模糊查询
查询包含欧阳二字的,相当于MySQL中的like '%欧阳%'

db.tb_user.find({"name":/欧阳/})

查询以欧阳二字开头的,相当于MySQL中的like '欧阳%'

db.tb_user.find({"name":/^欧阳/})

查询以欧阳二字结尾的,相当于MySQL中的like '%欧阳'

db.tb_user.find({"name":/欧阳$/})

11、按字段类型查询
查询tags字段值为array的文档(记录)

db.tb_user.find({"tags" : {$type : 'array'}})
//或者 db.tb_user.find({"tags" : {$type : 4}})

其它类型参见:http://www.runoob.com/mongodb/mongodb-operators-type.html

12、查询tags字段值为null的文档(记录)

db.tb_user.find({"tags" : null})
//下面的查询无效
db.tb_user.find({"tags" : {$in:[null], $exists :true}})   //$exists:true,确定存在该键;$in:[null],值为null

13、分页查询
说明:第一个json表示查询条件,第二个json表示显示哪些字段(1表示显示,0表示不显示),limit为每页显示数量,skip跳过指定数量的数据(如下面语句是跳过第1条语句,从第2条开始的)
也可这样理解:limit 是 pageSize,skip 是第几页*pageSize。

db.tb_user.find({"height":{$lte:175}}, {"mobile":1, "name":1, "_id":0}).limit(2).skip(1)

14、查询数组字段

db.tb_user.find({"tags":["程序猿"]}) //精确匹配
db.tb_user.find({"tags":{$all:["程序猿"]}}) //只要存在就可以被查询到
db.tb_user.find({"tags":{$size: 3}}) //长度为3个字长的才能被查询到

15、in与not in查询

db.tb_user.find({"mobile": {$in:["13771739110", "13771739111"]}})
db.tb_user.find({"mobile": {$nin:["13771739110", "13771739111"]}})

16、判断字段是否存在
查询存在height属性的文档(记录),即使是null也可以。

db.tb_user.find({"height": {$exists: true}})

17、$where,javascript查询运算符
通常,我们的查询语句可能非常复杂,这样无法满足要求的时候,可以自定义javascript函数来作为查询。
比如查询身高height加5公分,能达到180公分的文档(记录):

db.tb_user.find({"$where": "function() { return this.height+5 >= 180}"});

18、$slice选择返回文档的子集
比如返回数组字段tags指定的元素:

db.tb_user.find({"name":"欧阳"}, {"mobile":1, "tags":{$slice:2}}) //mobile没有特别作用,只是在这混用一下
db.tb_user.find({"name":"欧阳"}, {"mobile":1, "tags":{$slice:-2}}) //选取倒数2个
db.tb_user.find({"name":"欧阳"}, {"mobile":1, "tags":{$slice:[1,2]}}) //选取第2个和第3个

十、排序

说明:1为正序(相当于MySQL中的asc),-1为倒序(相当于MySQL中的desc),支持多字段排序。

db.tb_user.find().sort({height:-1});
db.tb_user.find().sort({height:-1, mobile:1}); //按身高`height`倒序,按手机号码`mobile`正序排列

十一、修改文档(记录)

1、使用update命令

 db.tb_user.update({'name':'欧阳'}, {$set:{'job':'系统架构师'}})

以上命令默认只会更新第一条满足条件的文档(记录),如果想更新所有满足条件的文档(记录),

 db.tb_user.update({'name':'欧阳'}, {$set:{'job':'系统架构师'}}, {multi:true})

如果需要更新的文档(记录)不存在,且不存在时自动插入这条文档(记录):

 db.tb_user.update({'name':'欧阳'}, {$set:{'job':'系统架构师'}}, {upsert:true})

注意{multi:true}不能和{upsert:true}同时使用,否则报异常。
如果文档(记录)不存在,且没有带upsert,则返回:

WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

表示0匹配,0插入,0修改。

2、使用save命令

sava为覆盖或新建操作,通常以_id作为条件,如果指定 _id字段,则会更新该 _id 的数据。如果不指定_id字段,则类似于insert()方法。
如:将name修改成欧阳222

db.tb_user.save({"_id" : ObjectId("5cbabde827b5acd06ce2ed29"), "name":"欧阳222","mobile":"15216689567","job":"软件工程师"})

如果字段不写完整,则会被丢弃,比如:

db.tb_user.save({"_id" : ObjectId("5cbabde827b5acd06ce2ed29"), "name":"欧阳222"})

job字段和内容就被删除掉。
如果缺省_id,则为插入:

db.tb_user.save({"name":"欧阳222", "job":"软件工程师222"})

返回:

WriteResult({ "nInserted" : 1 })

update和save方法都可以执行更新和插入新文档(记录)操作,而当他们都做更新操作时,区别在于:update指定条件时可以很灵活,但save只能指定_id为条件。

十二、删除文档(记录)

1、删除所有name欧阳222的文档(记录)。

db.tb_user.remove({"name":'欧阳222'})
db.repairDatabase()

db.tb_user.deleteMany({"name":"欧阳222"})

2、删除满足条件的一条文档(记录)(最旧的,可以理解为升序中第一条)

db.tb_user.remove({"name":'欧阳222'}, 1)  //第二个参数可以是true或1
db.repairDatabase()

db.tb_user.deleteOne({"name":"欧阳222"})

3、删除所有文档(记录),类似MySQL的truncate命令

db.tb_user.remove({})
db.repairDatabase()

db.tb_user.deleteMany({})

4、使用remove()方法删除时,并不会真正释放空间。

db.repairDatabase()
//或者 db.runCommand({ repairDatabase: 1 })

执行上述命令才会真正释放空间。

十三、删除集合(表)

db.tb_user.drop()

十四、删库跑路

use db_vcstock #切换要删除的数据库
db.dropDatabase()

返回:

{ "ok" : 1 }

十五、创建索引

1、创建以身高height降序、手机号码mobile升序的索引(索引名为name_height_index),且在后台运行操作。

db.tb_user.createIndex({"name":1, "height":-1},  {background: true, name:"name_height_index"})

如果不指定索引名字name,则由系统自动生成,如:name_1_height_-1(可通过navicat客户端方便地查看)

2、创建唯一索引
在mongdb中,_id字段与MySQL中的自增字段一样,默认是唯一不能重复的,所以无需给_id创建唯一索引。
下面我们给手机号码mobile创建一个唯一索引:

db.tb_user.createIndex({"mobile":1},  {background: true, name:"mobile_unique_index", "unique":true})

如果手机号码字段有重复值,将会报错。

索引更多操作:
使用db.tb_user.getIndexes()查看集合(表)索引
使用db.tb_user.totalIndexSize()查看索引占用大小
删除集合(表)的所有索引db.tb_user.dropIndexes()(除自动创建的_id_索引外)
删除指定的集合(表)的索引db.tb_user.dropIndex("name_height_index"),注意这里命令是dropIndex,非dropIndexes

附测试数据:

db.getCollection("tb_user").insert( {
    _id: ObjectId("5cbab50a916d7f671c7b416a"),
    mobile: "13771739110",
    name: "欧阳",
    sex: "男",
    height: 175,
    job: "软件工程师",
    url: "http://www.xxx.com",
    tags: [
        "宅男",
        "程序猿",
        "吃货"
    ],
    "create_time": new Date()
} );
db.getCollection("tb_user").insert( {
    _id: ObjectId("5cbab69c916d7f671c7b416b"),
    mobile: "13771739111",
    name: "欧阳2",
    sex: "男",
    height: 180,
    job: "软件工程师",
    url: "http://www.xxx.com",
    tags: [
        "宅男",
        "程序猿",
        "吃货"
    ],
    "create_time": new Date()
} );
db.getCollection("tb_user").insert( {
    _id: ObjectId("5cbabde827b5acd06ce2ed29"),
    mobile: "13771739112",
    name: "张三",
    sex: "男"
} );
db.getCollection("tb_user").insert( {
    _id: ObjectId("5cbaf607b449d4606c75be30")
} );
db.getCollection("tb_user").insert( {
    _id: ObjectId("5cbb0d55a729000026004f05"),
    mobile: "13771739115",
    name: "李四",
    sex: "女",
    height: 165
} );
db.getCollection("tb_user").insert( {
    _id: ObjectId("5cbbefd1a729000026004f06"),
    mobile: "15216689566",
    name: "王五",
    sex: "女",
    height: 160,
    job: "软件工程师",
    url: "http://www.xxx.com",
    tags: [
        "宅男",
        "程序猿",
        "吃货"
    ],
    "create_time": new Date()
} );


下一篇:【MongoDB快速入门】第五篇 备份与恢复

相关文章

网友评论

    本文标题:【MongoDB快速入门】第四篇 数据库常用操作

    本文链接:https://www.haomeiwen.com/subject/pmwkgqtx.html