MongoDB——常用命令

小黄自我修炼之Mongo篇,课程视频来自于黑马程序员 点击跳转

关于Mongo的简介和安装网上一搜一大堆,小黄的博客用来记录如何使用Mongo

本文的例子来自于现实中出现的情况:文章评论功能,自始至终都会贯彻这个例子

MongoDB常用命令

数据库操作

选择、创建数据库

选择和创建都使用use指令,如果数据库存在,使用该数据库,如果数据库不存在则新建一个数据库并使用

# use 数据库名称
> use articledb
switched to db articledb
查看有权限查看的所有数据库命令
# show dbs/databases
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> show databases
admin   0.000GB
config  0.000GB
local   0.000GB
查看当前正在使用的数据库

mongo默认使用的数据库为test,如果你没有选择数据库,那么集合会放在test中

# db
> db
articledb
系统数据库简介
  • admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特 定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
删除数据库
# db.dropDatabase();
> db.dropDatabase()
{ "ok" : 1 }

集合操作

Mongo中的集合,类似于关系型数据库中的表,可以显式的创建集合,也可以隐式的创建

显式创建集合(了解即可)

需要注意的是,集合名称必须要使用双引号,表示是字符串,否则会报错:myCollection is not defined

# db.createCollection(集合名称)
> db.createCollection("myCollection")
{ "ok" : 1 }
查看当前库中的所有集合

使用以下两种命令都可以,人都喜欢偷懒,小黄也不例外,喜欢用show tables

# show tables/collections
> show tables
myCollection
> show collections
myCollection
隐式创建集合

当向一个集合中插入文档的时候,如果集合不存在,会自动创建集合,这个在接下来文档的操作中会演示

Mongo中的文档可以理解为关系型数据库表中存储的内容

删除集合

如果成功删除集合,返回true,否则返回false

# db.集合名称.drop()
> db.myCollection.drop()
true
# 或者使用 db.collection.drop() 删除
> db.collection.drop()删除
false

文档基本的CRUO操作

文档是Mongo中用于存储数据的,文档的数据结构和JSON类似,所有存储在集合中的数据都是BSON格式,BSON是JSON的二进制版本

文档的插入

单个插入文档

使用insert和save方法向集合中插入文档

db.集合名称.insert(文档数据)

示例:向comment的集合中插入一条测试数据

> db.comment.insert({"articleid":"100000","content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null})
# 成功会返回以下信息
WriteResult({ "nInserted" : 1 })

注意点

  • comment集合如果不存在,会隐式创建该集合
  • mongo中的数字,默认情况下是double类型,如果想要存储整型使用NumberInt(),否则取出来的数据会有问题
  • 插入当前日期使用new Date()
  • 插入数据没有指定_id,会自动生成主键值
  • 如果某字段没值,可以赋值为null

批量插入文档

db.集合名词.insertMany()

示例:批量插入多条文章评论

> db.comment.insertMany([{"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08-05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"},{"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水","userid":"1005","nickname":"伊人憔悴","createdatetime":new Date("2019-08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"},{"_id":"3","articleid":"100001","content":"我一直喝凉开水,冬天夏天都喝。","userid":"1004","nickname":"杰克船长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state":"1"},{"_id":"4","articleid":"100001","content":"专家说不能空腹吃饭,影响健康。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08-06T08:18:35.288Z"),"likenum":NumberInt(2000),"state":"1"},{"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不能喝,因为烫嘴。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08-06T11:01:02.521Z"),"likenum":NumberInt(3000),"state":"1"}]);
{
        "acknowledged" : true,
        "insertedIds" : [
                "1",
                "2",
                "3",
                "4",
                "5"
        ]
}

注意点

  • 插入时指定了_id,则主键就是该值
  • 如果某条数据插入失败,将会终止插入,但插入成功的数据不会回滚

因为批量插入数据较多,容易出现失败情况,因此可以使用try-catch语句捕捉异常

try {
db.comment.insertMany([{"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08-05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"},{"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水","userid":"1005","nickname":"伊人憔悴","createdatetime":new Date("2019-08-05T23:58:51.485Z"),"likenum":NumberInt(888),"state":"1"},{"_id":"3","articleid":"100001","content":"我一直喝凉开水,冬天夏天都喝。","userid":"1004","nickname":"杰克船长","createdatetime":new Date("2019-08-06T01:05:06.321Z"),"likenum":NumberInt(666),"state":"1"},{"_id":"4","articleid":"100001","content":"专家说不能空腹吃饭,影响健康。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08-06T08:18:35.288Z"),"likenum":NumberInt(2000),"state":"1"},{"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不能喝,因为烫嘴。","userid":"1003","nickname":"凯撒","createdatetime":new Date("2019-08-06T11:01:02.521Z"),"likenum":NumberInt(3000),"state":"1"}]);
} catch (e) 
{
print (e);
}
文档的基本查询

查询数据语法如下

db.集合名称.find(查询条件,筛选字段)

查询所有

> db.comment.find()
{ "_id" : ObjectId("61ee42848d8add27409258a2"), "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2022-01-24T06:09:08.488Z"), "likenum" : 10, "state" : null }
{ "_id" : "1", "articleid" : "100001", "content" : "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。", "userid" : "1002", "nickname" : "相忘于江湖", "createdatetime" : ISODate("2019-08-05T22:08:15.522Z"), "likenum" : 1000, "state" : "1" }
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 888, "state" : "1" }
{ "_id" : "3", "articleid" : "100001", "content" : "我一直喝凉开水,冬天夏天都喝。", "userid" : "1004", "nickname" : "杰克船长", "createdatetime" : ISODate("2019-08-06T01:05:06.321Z"), "likenum" : 666, "state" : "1" }
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }

按照条件查询

比如我要查找userid为1003的信息

> db.comment.find({userid:"1003"})
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }

如果想查询满足该条件的第一条数据,使用findOne

> db.comment.findOne({userid:"1003"})
{
        "_id" : "4",
        "articleid" : "100001",
        "content" : "专家说不能空腹吃饭,影响健康。",
        "userid" : "1003",
        "nickname" : "凯撒",
        "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"),
        "likenum" : 2000,
        "state" : "1"
}

投影查询

有时候我们不想显示所有字段的数据,比如查询userid为1003的数据,但是查询结果只显示_id,userid,nickname

# 其中1代表显示,0代表隐藏,不指定的默认是0,主键默认是1,如果想隐藏主键,_id:0
> db.comment.find({userid:"1003"},{userid:1,nickname:1})
{ "_id" : "4", "userid" : "1003", "nickname" : "凯撒" }
{ "_id" : "5", "userid" : "1003", "nickname" : "凯撒" }
文档的更新

文档更新的语法

db.集合名称.update(查询条件,更新数据,参数)

文档的覆盖

如果我们想修改主键为1的记录,点赞量修改为1001,使用以下代码

> db.comment.update({_id:"1"},{likenum:NumberInt(1001)})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

这时候我们查询该记录,会发现修改的信息将我们原来的信息覆盖掉了,

> db.comment.find({_id:"1"})
{ "_id" : "1", "likenum" : 1001 }

局部修改

通常情况下我们一般都是用局部修改,这次我们修改主键为2的记录,点赞量修改为1001,使用修改器$set来实现

> db.comment.update({_id:"2"},{$set:{likenum:NumberInt(1001)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({_id:"2"})
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 1001, "state" : "1" }

批量修改

修改userid为1003的用户,nickname修改为凯撒大帝

> db.comment.update({userid:"1003"},{$set{nickname:"凯撒大帝"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({userid:"1003"})
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }

看修改结果我们发现只修改了一条满足条件的信息,如果需要批量修改,需要加上第三个属性值multi:true

> db.comment.update({userid:"1003"},{$set:{nickname:"凯撒大帝"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.comment.find({userid:"1003"})
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒大帝", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒大帝", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3000, "state" : "1" }

列值增长的修改

在实际过程中,我们可能浏览的人点赞一次,点赞量我们就需要自增1,在mongo中需要使用$inc来实现

> db.comment.update({_id:"5"},{$inc:{likenum:NumberInt(1)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({_id:"5"})
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒大帝", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3001, "state" : "1" }
删除文档
db.集合名词.remove(条件)

删除_id为1的记录

db.comment.remove({_id:"1"})

删除全部记录,慎用!!!!

db.comment.remove({})

文档的分页查询

统计查询

类似于关系型数据库中的count()

db.comment.count(查询条件,额外选项)

统计所有记录数

> db.comment.count()
4

按条件统计记录数

> db.comment.count({userid:"1003"})
2
分页查询

可以使用limit来读取指定数量的数据,使用skip方法来跳过指定数量的数据

db.集合名称.find().limit(number).skip(number)

一页两条,查询第一页数据

> db.comment.find().limit(2)
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 888, "state" : "1" }
{ "_id" : "3", "articleid" : "100001", "content" : "我一直喝凉开水,冬天夏天都喝。", "userid" : "1004", "nickname" : "杰克船长", "createdatetime" : ISODate("2019-08-06T01:05:06.321Z"), "likenum" : 666, "state" : "1" }

一页两条,查询第二页数据

> db.comment.find().limit(2).skip(2)
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒大帝", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
{ "_id" : "5", "articleid" : "100001", "content" : "研究表明,刚烧开的水千万不能喝,因为烫嘴。", "userid" : "1003", "nickname" : "凯撒大帝", "createdatetime" : ISODate("2019-08-06T11:01:02.521Z"), "likenum" : 3001, "state" : "1" }
排序查询

sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用 于降序排列。

db.集合名称.find().sort(排序方式)

根据userid降序,likenum升序查询

> db.comment.find({},{userid:1,likenum:1}).sort({userid:-1},{likenum:1})
{ "_id" : "2", "userid" : "1005", "likenum" : 888 }
{ "_id" : "3", "userid" : "1004", "likenum" : 666 }
{ "_id" : "4", "userid" : "1003", "likenum" : 2000 }
{ "_id" : "5", "userid" : "1003", "likenum" : 3001 }

skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。

文档的更多查询

正则的复杂条件查询

MongoDB的模糊查询是通过正则表达式的方式实现的

db.集合名称.find({字段:/正则表达式/})

示例:查询评论内容包含开水的所有文档

> db.comment.find({content:/开水/})
{ "_id" : "2", "articleid" : "100001", "content" : "我夏天空腹喝凉开水,冬天喝温开水", "userid" : "1005", "nickname" : "伊人憔悴", "createdatetime" : ISODate("2019-08-05T23:58:51.485Z"), "likenum" : 888, "state" : "1" }
{ "_id" : "3", "articleid" : "100001", "content" : "我一直喝凉开水,冬天夏天都喝。", "userid" : "1004", "nickname" : "杰克船长", "createdatetime" : ISODate("2019-08-06T01:05:06.321Z"), "likenum" : 666, "state" : "1" }

示例:查询评论内容中以专家开头的文档

> db.comment.find({content:/^专家/})
{ "_id" : "4", "articleid" : "100001", "content" : "专家说不能空腹吃饭,影响健康。", "userid" : "1003", "nickname" : "凯撒大帝", "createdatetime" : ISODate("2019-08-06T08:18:35.288Z"), "likenum" : 2000, "state" : "1" }
比较查询

在实际过程中,大于小于操作符也是很常用的

db.集合名称.find({ "field" : { $gt: value }}) # 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) # 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) # 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) # 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) # 不等于: field != value
包含查询

包含使用$in操作符。 示例:查询评论的集合中userid字段包含1003或1004的文档

db.comment.find({userid:{$in:["1003","1004"]}})

不包含使用$nin操作符。 示例:查询评论集合中userid字段不包含1003和1004的文档

db.comment.find({userid:{$nin:["1003","1004"]}})
条件连接查询

使用 a n d 或 and或 andor

示例:查询评论集合中likenum大于等于700 并且小于2000的文档

db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})

示例:查询评论集合中userid为1003,或者点赞数小于1000的文档记录

db.comment.find({$or:[ {userid:"1003"} ,{likenum:{$lt:1000} }]}

索引的使用

索引的查看

跟关系型数据库一样,Mongo默认也有一个主键索引,主键索引无法删除

> db.comment.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "articledb.comment"
        }
]
索引的创建
# 字段值属性为1升序,-1降序
db.集合名称.createIndex(字段值, 选项)

创建单字段索引

> db.comment.createIndex({userid:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

创建复合索引

对userid和nickname同时建立复合索引

> db.comment.createIndex({userid:1,nickname:-1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
}

再来查看一下索引

> db.comment.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "articledb.comment"
        },
        {
                "v" : 2,
                "key" : {
                        "userid" : 1
                },
                "name" : "userid_1",
                "ns" : "articledb.comment"
        },
        {
                "v" : 2,
                "key" : {
                        "userid" : 1,
                        "nickname" : -1
                },
                "name" : "userid_1_nickname_-1",
                "ns" : "articledb.comment"
        }
]
索引的移除

指定索引的移除

> db.comment.dropIndex("userid_1")
{ "nIndexesWas" : 3, "ok" : 1 }

所有索引移除

> db.comment.dropIndexes()
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值