上一篇:【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()
} );
网友评论