irpas技术客

MongoDB——常用命令_贼爱学习的小黄

irpas 2066

小黄自我修炼之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或 and或or

示例:查询评论集合中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 }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #MongoDB常用命令 #use #数据库名称ampgt #To